{
  "id": "48f8c2d8d55aa1a43614a622b6e6f4d7",
  "_format": "hh-sol-build-info-1",
  "solcVersion": "0.6.12",
  "solcLongVersion": "0.6.12+commit.27d51765",
  "input": {
    "language": "Solidity",
    "sources": {
      "contracts/flat/BentoBoxV1Flat.sol": {
        "content": "// SPDX-License-Identifier: UNLICENSED\n// The BentoBox\n\n//  ▄▄▄▄· ▄▄▄ . ▐ ▄ ▄▄▄▄▄      ▄▄▄▄·       ▐▄• ▄\n//  ▐█ ▀█▪▀▄.▀·█▌▐█•██  ▪     ▐█ ▀█▪▪      █▌█▌▪\n//  ▐█▀▀█▄▐▀▀▪▄▐█▐▐▌ ▐█.▪ ▄█▀▄ ▐█▀▀█▄ ▄█▀▄  ·██·\n//  ██▄▪▐█▐█▄▄▌██▐█▌ ▐█▌·▐█▌.▐▌██▄▪▐█▐█▌.▐▌▪▐█·█▌\n//  ·▀▀▀▀  ▀▀▀ ▀▀ █▪ ▀▀▀  ▀█▄▀▪·▀▀▀▀  ▀█▄▀▪•▀▀ ▀▀\n\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\n\n// Copyright (c) 2021 BoringCrypto - All rights reserved\n// Twitter: @Boring_Crypto\n\n// Special thanks to Keno for all his hard work and support\n\n// Version 22-Mar-2021\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\n// solhint-disable avoid-low-level-calls\n// solhint-disable not-rely-on-time\n// solhint-disable no-inline-assembly\n\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\n// License-Identifier: MIT\n\ninterface IERC20 {\n    function totalSupply() external view returns (uint256);\n\n    function balanceOf(address account) external view returns (uint256);\n\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    event Transfer(address indexed from, address indexed to, uint256 value);\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /// @notice EIP 2612\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    function decimals() external view returns (uint256);\n}\n\n// File contracts/interfaces/IFlashLoan.sol\n// License-Identifier: MIT\n\ninterface IFlashBorrower {\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\n    /// @param sender The address of the invoker of this flashloan.\n    /// @param token The address of the token that is loaned.\n    /// @param amount of the `token` that is loaned.\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\n    /// @param data Additional data that was passed to the flashloan function.\n    function onFlashLoan(\n        address sender,\n        IERC20 token,\n        uint256 amount,\n        uint256 fee,\n        bytes calldata data\n    ) external;\n}\n\ninterface IBatchFlashBorrower {\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\n    /// @param sender The address of the invoker of this flashloan.\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\n    /// @param data Additional data that was passed to the flashloan function.\n    function onBatchFlashLoan(\n        address sender,\n        IERC20[] calldata tokens,\n        uint256[] calldata amounts,\n        uint256[] calldata fees,\n        bytes calldata data\n    ) external;\n}\n\n// File contracts/interfaces/IWETH.sol\n// License-Identifier: MIT\n\ninterface IWETH {\n    function deposit() external payable;\n\n    function withdraw(uint256) external;\n}\n\n// File contracts/interfaces/IStrategy.sol\n// License-Identifier: MIT\n\ninterface IStrategy {\n    /// @notice Send the assets to the Strategy and call skim to invest them.\n    /// @param amount The amount of tokens to invest.\n    function skim(uint256 amount) external;\n\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\n    /// @param balance The amount of tokens the caller thinks it has invested.\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\n\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\n    /// @dev The `actualAmount` should be very close to the amount.\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\n    /// @param amount The requested amount the caller wants to withdraw.\n    /// @return actualAmount The real amount that is withdrawn.\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\n\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\n    /// @param balance The amount of tokens the caller thinks it has invested.\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\n    function exit(uint256 balance) external returns (int256 amountAdded);\n}\n\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\n// License-Identifier: MIT\n\nlibrary BoringERC20 {\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\n\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\n    /// Reverts on a failed transfer.\n    /// @param token The address of the ERC-20 token.\n    /// @param to Transfer tokens to.\n    /// @param amount The token amount.\n    function safeTransfer(\n        IERC20 token,\n        address to,\n        uint256 amount\n    ) internal {\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \"BoringERC20: Transfer failed\");\n    }\n\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\n    /// Reverts on a failed transfer.\n    /// @param token The address of the ERC-20 token.\n    /// @param from Transfer tokens from.\n    /// @param to Transfer tokens to.\n    /// @param amount The token amount.\n    function safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 amount\n    ) internal {\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \"BoringERC20: TransferFrom failed\");\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\n// License-Identifier: MIT\n\n/// @notice A library for performing overflow-/underflow-safe math,\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\nlibrary BoringMath {\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\n        require(b == 0 || (c = a * b) / b == a, \"BoringMath: Mul Overflow\");\n    }\n\n    function to128(uint256 a) internal pure returns (uint128 c) {\n        require(a <= uint128(-1), \"BoringMath: uint128 Overflow\");\n        c = uint128(a);\n    }\n\n    function to64(uint256 a) internal pure returns (uint64 c) {\n        require(a <= uint64(-1), \"BoringMath: uint64 Overflow\");\n        c = uint64(a);\n    }\n\n    function to32(uint256 a) internal pure returns (uint32 c) {\n        require(a <= uint32(-1), \"BoringMath: uint32 Overflow\");\n        c = uint32(a);\n    }\n}\n\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\nlibrary BoringMath128 {\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n}\n\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\nlibrary BoringMath64 {\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n}\n\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\nlibrary BoringMath32 {\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\n// License-Identifier: MIT\n\nstruct Rebase {\n    uint128 elastic;\n    uint128 base;\n}\n\n/// @notice A rebasing library using overflow-/underflow-safe math.\nlibrary RebaseLibrary {\n    using BoringMath for uint256;\n    using BoringMath128 for uint128;\n\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\n    function toBase(\n        Rebase memory total,\n        uint256 elastic,\n        bool roundUp\n    ) internal pure returns (uint256 base) {\n        if (total.elastic == 0) {\n            base = elastic;\n        } else {\n            base = elastic.mul(total.base) / total.elastic;\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\n                base = base.add(1);\n            }\n        }\n    }\n\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\n    function toElastic(\n        Rebase memory total,\n        uint256 base,\n        bool roundUp\n    ) internal pure returns (uint256 elastic) {\n        if (total.base == 0) {\n            elastic = base;\n        } else {\n            elastic = base.mul(total.elastic) / total.base;\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\n                elastic = elastic.add(1);\n            }\n        }\n    }\n\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\n    /// @return (Rebase) The new total.\n    /// @return base in relationship to `elastic`.\n    function add(\n        Rebase memory total,\n        uint256 elastic,\n        bool roundUp\n    ) internal pure returns (Rebase memory, uint256 base) {\n        base = toBase(total, elastic, roundUp);\n        total.elastic = total.elastic.add(elastic.to128());\n        total.base = total.base.add(base.to128());\n        return (total, base);\n    }\n\n    /// @notice Sub `base` from `total` and update `total.elastic`.\n    /// @return (Rebase) The new total.\n    /// @return elastic in relationship to `base`.\n    function sub(\n        Rebase memory total,\n        uint256 base,\n        bool roundUp\n    ) internal pure returns (Rebase memory, uint256 elastic) {\n        elastic = toElastic(total, base, roundUp);\n        total.elastic = total.elastic.sub(elastic.to128());\n        total.base = total.base.sub(base.to128());\n        return (total, elastic);\n    }\n\n    /// @notice Add `elastic` and `base` to `total`.\n    function add(\n        Rebase memory total,\n        uint256 elastic,\n        uint256 base\n    ) internal pure returns (Rebase memory) {\n        total.elastic = total.elastic.add(elastic.to128());\n        total.base = total.base.add(base.to128());\n        return total;\n    }\n\n    /// @notice Subtract `elastic` and `base` to `total`.\n    function sub(\n        Rebase memory total,\n        uint256 elastic,\n        uint256 base\n    ) internal pure returns (Rebase memory) {\n        total.elastic = total.elastic.sub(elastic.to128());\n        total.base = total.base.sub(base.to128());\n        return total;\n    }\n\n    /// @notice Add `elastic` to `total` and update storage.\n    /// @return newElastic Returns updated `elastic`.\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\n    }\n\n    /// @notice Subtract `elastic` from `total` and update storage.\n    /// @return newElastic Returns updated `elastic`.\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\n// License-Identifier: MIT\n\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\n// Edited by BoringCrypto\n\ncontract BoringOwnableData {\n    address public owner;\n    address public pendingOwner;\n}\n\ncontract BoringOwnable is BoringOwnableData {\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /// @notice `owner` defaults to msg.sender on construction.\n    constructor() public {\n        owner = msg.sender;\n        emit OwnershipTransferred(address(0), msg.sender);\n    }\n\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\n    /// Can only be invoked by the current `owner`.\n    /// @param newOwner Address of the new owner.\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\n    function transferOwnership(\n        address newOwner,\n        bool direct,\n        bool renounce\n    ) public onlyOwner {\n        if (direct) {\n            // Checks\n            require(newOwner != address(0) || renounce, \"Ownable: zero address\");\n\n            // Effects\n            emit OwnershipTransferred(owner, newOwner);\n            owner = newOwner;\n            pendingOwner = address(0);\n        } else {\n            // Effects\n            pendingOwner = newOwner;\n        }\n    }\n\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\n    function claimOwnership() public {\n        address _pendingOwner = pendingOwner;\n\n        // Checks\n        require(msg.sender == _pendingOwner, \"Ownable: caller != pending owner\");\n\n        // Effects\n        emit OwnershipTransferred(owner, _pendingOwner);\n        owner = _pendingOwner;\n        pendingOwner = address(0);\n    }\n\n    /// @notice Only allows the `owner` to execute the function.\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"Ownable: caller is not the owner\");\n        _;\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\n// License-Identifier: MIT\n\ninterface IMasterContract {\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\n    /// Also kown as the constructor for cloned contracts.\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\n    /// @param data Can be abi encoded arguments or anything else.\n    function init(bytes calldata data) external payable;\n}\n\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\n// License-Identifier: MIT\n\ncontract BoringFactory {\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\n\n    /// @notice Mapping from clone contracts to their masterContract.\n    mapping(address => address) public masterContractOf;\n\n    /// @notice Deploys a given master Contract as a clone.\n    /// Any ETH transferred with this call is forwarded to the new clone.\n    /// Emits `LogDeploy`.\n    /// @param masterContract The address of the contract to clone.\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\n    /// @return cloneAddress Address of the created clone contract.\n    function deploy(\n        address masterContract,\n        bytes calldata data,\n        bool useCreate2\n    ) public payable returns (address cloneAddress) {\n        require(masterContract != address(0), \"BoringFactory: No masterContract\");\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\n\n        if (useCreate2) {\n            // each masterContract has different code already. So clones are distinguished by their data only.\n            bytes32 salt = keccak256(data);\n\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\n            assembly {\n                let clone := mload(0x40)\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n                mstore(add(clone, 0x14), targetBytes)\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n                cloneAddress := create2(0, clone, 0x37, salt)\n            }\n        } else {\n            assembly {\n                let clone := mload(0x40)\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n                mstore(add(clone, 0x14), targetBytes)\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n                cloneAddress := create(0, clone, 0x37)\n            }\n        }\n        masterContractOf[cloneAddress] = masterContract;\n\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\n\n        emit LogDeploy(masterContract, data, cloneAddress);\n    }\n}\n\n// File contracts/MasterContractManager.sol\n// License-Identifier: UNLICENSED\n\ncontract MasterContractManager is BoringOwnable, BoringFactory {\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\n    event LogRegisterProtocol(address indexed protocol);\n\n    /// @notice masterContract to user to approval state\n    mapping(address => mapping(address => bool)) public masterContractApproved;\n    /// @notice masterContract to whitelisted state for approval without signed message\n    mapping(address => bool) public whitelistedMasterContracts;\n    /// @notice user nonces for masterContract approvals\n    mapping(address => uint256) public nonces;\n\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\n        keccak256(\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\");\n    // See https://eips.ethereum.org/EIPS/eip-191\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \"\\x19\\x01\";\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\n        keccak256(\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\");\n\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 private immutable _DOMAIN_SEPARATOR;\n    // solhint-disable-next-line var-name-mixedcase\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\n\n    constructor() public {\n        uint256 chainId;\n        assembly {\n            chainId := chainid()\n        }\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\n    }\n\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\"BentoBox V1\"), chainId, address(this)));\n    }\n\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\n        uint256 chainId;\n        assembly {\n            chainId := chainid()\n        }\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\n    }\n\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\n    function registerProtocol() public {\n        masterContractOf[msg.sender] = msg.sender;\n        emit LogRegisterProtocol(msg.sender);\n    }\n\n    /// @notice Enables or disables a contract for approval without signed message.\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\n        // Checks\n        require(masterContract != address(0), \"MasterCMgr: Cannot approve 0\");\n\n        // Effects\n        whitelistedMasterContracts[masterContract] = approved;\n        emit LogWhiteListMasterContract(masterContract, approved);\n    }\n\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\n    /// @param user The address of the user that approves or revokes access.\n    /// @param masterContract The address who gains or loses access.\n    /// @param approved If True approves access. If False revokes access.\n    /// @param v Part of the signature. (See EIP-191)\n    /// @param r Part of the signature. (See EIP-191)\n    /// @param s Part of the signature. (See EIP-191)\n    // F4 - Check behaviour for all function arguments when wrong or extreme\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\n    function setMasterContractApproval(\n        address user,\n        address masterContract,\n        bool approved,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) public {\n        // Checks\n        require(masterContract != address(0), \"MasterCMgr: masterC not set\"); // Important for security\n\n        // If no signature is provided, the fallback is executed\n        if (r == 0 && s == 0 && v == 0) {\n            require(user == msg.sender, \"MasterCMgr: user not sender\");\n            require(masterContractOf[user] == address(0), \"MasterCMgr: user is clone\");\n            require(whitelistedMasterContracts[masterContract], \"MasterCMgr: not whitelisted\");\n        } else {\n            // Important for security - any address without masterContract has address(0) as masterContract\n            // So approving address(0) would approve every address, leading to full loss of funds\n            // Also, ecrecover returns address(0) on failure. So we check this:\n            require(user != address(0), \"MasterCMgr: User cannot be 0\");\n\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\n            // C10: nonce + chainId are used to prevent replays\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\n            // C11: signature is EIP-712 compliant\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\n            // C12: abi.encodePacked has fixed length parameters\n            bytes32 digest = keccak256(\n                abi.encodePacked(\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\n                    DOMAIN_SEPARATOR(),\n                    keccak256(\n                        abi.encode(\n                            APPROVAL_SIGNATURE_HASH,\n                            approved\n                                ? keccak256(\"Give FULL access to funds in (and approved to) BentoBox?\")\n                                : keccak256(\"Revoke access to BentoBox?\"),\n                            user,\n                            masterContract,\n                            approved,\n                            nonces[user]++\n                        )\n                    )\n                )\n            );\n            address recoveredAddress = ecrecover(digest, v, r, s);\n            require(recoveredAddress == user, \"MasterCMgr: Invalid Signature\");\n        }\n\n        // Effects\n        masterContractApproved[masterContract][user] = approved;\n        emit LogSetMasterContractApproval(masterContract, user, approved);\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\n// License-Identifier: MIT\n\ncontract BaseBoringBatchable {\n    /// @dev Helper function to extract a useful revert message from a failed call.\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\n        if (_returnData.length < 68) return \"Transaction reverted silently\";\n\n        assembly {\n            // Slice the sighash.\n            _returnData := add(_returnData, 0x04)\n        }\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\n    }\n\n    /// @notice Allows batched call to self (this contract).\n    /// @param calls An array of inputs for each call.\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\n    // C3: The length of the loop is fully under user control, so can't be exploited\n    // C7: Delegatecall is only used on the same contract, so it's safe\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\n        successes = new bool[](calls.length);\n        results = new bytes[](calls.length);\n        for (uint256 i = 0; i < calls.length; i++) {\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\n            require(success || !revertOnFail, _getRevertMsg(result));\n            successes[i] = success;\n            results[i] = result;\n        }\n    }\n}\n\ncontract BoringBatchable is BaseBoringBatchable {\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\n    /// Lookup `IERC20.permit`.\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\n    function permitToken(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) public {\n        token.permit(from, to, amount, deadline, v, r, s);\n    }\n}\n\n// File contracts/BentoBox.sol\n// License-Identifier: UNLICENSED\n\n/// @title BentoBox\n/// @author BoringCrypto, Keno\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\n/// Yield from this will go to the token depositors.\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\n    using BoringMath for uint256;\n    using BoringMath128 for uint128;\n    using BoringERC20 for IERC20;\n    using RebaseLibrary for Rebase;\n\n    // ************** //\n    // *** EVENTS *** //\n    // ************** //\n\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\n\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\n\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\n\n    // *************** //\n    // *** STRUCTS *** //\n    // *************** //\n\n    struct StrategyData {\n        uint64 strategyStartDate;\n        uint64 targetPercentage;\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\n    }\n\n    // ******************************** //\n    // *** CONSTANTS AND IMMUTABLES *** //\n    // ******************************** //\n\n    // V2 - Can they be private?\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\n    IERC20 private immutable wethToken;\n\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\n\n    // ***************** //\n    // *** VARIABLES *** //\n    // ***************** //\n\n    // Balance per token per address/contract in shares\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\n\n    // Rebase from amount to share\n    mapping(IERC20 => Rebase) public totals;\n\n    mapping(IERC20 => IStrategy) public strategy;\n    mapping(IERC20 => IStrategy) public pendingStrategy;\n    mapping(IERC20 => StrategyData) public strategyData;\n\n    // ******************* //\n    // *** CONSTRUCTOR *** //\n    // ******************* //\n\n    constructor(IERC20 wethToken_) public {\n        wethToken = wethToken_;\n    }\n\n    // ***************** //\n    // *** MODIFIERS *** //\n    // ***************** //\n\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\n    /// If 'from' is msg.sender, it's allowed.\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\n    /// can be taken by anyone.\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\n    modifier allowed(address from) {\n        if (from != msg.sender && from != address(this)) {\n            // From is sender or you are skimming\n            address masterContract = masterContractOf[msg.sender];\n            require(masterContract != address(0), \"BentoBox: no masterContract\");\n            require(masterContractApproved[masterContract][from], \"BentoBox: Transfer not approved\");\n        }\n        _;\n    }\n\n    // ************************** //\n    // *** INTERNAL FUNCTIONS *** //\n    // ************************** //\n\n    /// @dev Returns the total balance of `token` this contracts holds,\n    /// plus the total amount this contract thinks the strategy holds.\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\n    }\n\n    // ************************ //\n    // *** PUBLIC FUNCTIONS *** //\n    // ************************ //\n\n    /// @dev Helper function to represent an `amount` of `token` in shares.\n    /// @param token The ERC-20 token.\n    /// @param amount The `token` amount.\n    /// @param roundUp If the result `share` should be rounded up.\n    /// @return share The token amount represented in shares.\n    function toShare(\n        IERC20 token,\n        uint256 amount,\n        bool roundUp\n    ) external view returns (uint256 share) {\n        share = totals[token].toBase(amount, roundUp);\n    }\n\n    /// @dev Helper function represent shares back into the `token` amount.\n    /// @param token The ERC-20 token.\n    /// @param share The amount of shares.\n    /// @param roundUp If the result should be rounded up.\n    /// @return amount The share amount back into native representation.\n    function toAmount(\n        IERC20 token,\n        uint256 share,\n        bool roundUp\n    ) external view returns (uint256 amount) {\n        amount = totals[token].toElastic(share, roundUp);\n    }\n\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\n    /// @param token_ The ERC-20 token to deposit.\n    /// @param from which account to pull the tokens.\n    /// @param to which account to push the tokens.\n    /// @param amount Token amount in native representation to deposit.\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\n    /// @return amountOut The amount deposited.\n    /// @return shareOut The deposited amount represented in shares.\n    function deposit(\n        IERC20 token_,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 share\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\n        // Checks\n        require(to != address(0), \"BentoBox: to not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\n        Rebase memory total = totals[token];\n\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\n        require(total.elastic != 0 || token.totalSupply() > 0, \"BentoBox: No tokens\");\n        if (share == 0) {\n            // value of the share may be lower than the amount due to rounding, that's ok\n            share = total.toBase(amount, false);\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\n                return (0, 0);\n            }\n        } else {\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\n            amount = total.toElastic(share, true);\n        }\n\n        // In case of skimming, check that only the skimmable amount is taken.\n        // For ETH, the full balance is available, so no need to check.\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\n        require(\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\n            \"BentoBox: Skim too much\"\n        );\n\n        balanceOf[token][to] = balanceOf[token][to].add(share);\n        total.base = total.base.add(share.to128());\n        total.elastic = total.elastic.add(amount.to128());\n        totals[token] = total;\n\n        // Interactions\n        // During the first deposit, we check that this token is 'real'\n        if (token_ == USE_ETHEREUM) {\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\n            IWETH(address(wethToken)).deposit{value: amount}();\n        } else if (from != address(this)) {\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\n            token.safeTransferFrom(from, address(this), amount);\n        }\n        emit LogDeposit(token, from, to, amount, share);\n        amountOut = amount;\n        shareOut = share;\n    }\n\n    /// @notice Withdraws an amount of `token` from a user account.\n    /// @param token_ The ERC-20 token to withdraw.\n    /// @param from which user to pull the tokens.\n    /// @param to which user to push the tokens.\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\n    /// @param share Like above, but `share` takes precedence over `amount`.\n    function withdraw(\n        IERC20 token_,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 share\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\n        // Checks\n        require(to != address(0), \"BentoBox: to not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\n        Rebase memory total = totals[token];\n        if (share == 0) {\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\n            share = total.toBase(amount, true);\n        } else {\n            // amount may be lower than the value of share due to rounding, that's ok\n            amount = total.toElastic(share, false);\n        }\n\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\n        total.elastic = total.elastic.sub(amount.to128());\n        total.base = total.base.sub(share.to128());\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \"BentoBox: cannot empty\");\n        totals[token] = total;\n\n        // Interactions\n        if (token_ == USE_ETHEREUM) {\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\n            IWETH(address(wethToken)).withdraw(amount);\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\n            (bool success, ) = to.call{value: amount}(\"\");\n            require(success, \"BentoBox: ETH transfer failed\");\n        } else {\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\n            token.safeTransfer(to, amount);\n        }\n        emit LogWithdraw(token, from, to, amount, share);\n        amountOut = amount;\n        shareOut = share;\n    }\n\n    /// @notice Transfer shares from a user account to another one.\n    /// @param token The ERC-20 token to transfer.\n    /// @param from which user to pull the tokens.\n    /// @param to which user to push the tokens.\n    /// @param share The amount of `token` in shares.\n    // Clones of master contracts can transfer from any account that has approved them\n    // F3 - Can it be combined with another similar function?\n    // F3: This isn't combined with transferMultiple for gas optimization\n    function transfer(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 share\n    ) public allowed(from) {\n        // Checks\n        require(to != address(0), \"BentoBox: to not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\n        balanceOf[token][to] = balanceOf[token][to].add(share);\n\n        emit LogTransfer(token, from, to, share);\n    }\n\n    /// @notice Transfer shares from a user account to multiple other ones.\n    /// @param token The ERC-20 token to transfer.\n    /// @param from which user to pull the tokens.\n    /// @param tos The receivers of the tokens.\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\n    // F3 - Can it be combined with another similar function?\n    // F3: This isn't combined with transfer for gas optimization\n    function transferMultiple(\n        IERC20 token,\n        address from,\n        address[] calldata tos,\n        uint256[] calldata shares\n    ) public allowed(from) {\n        // Checks\n        require(tos[0] != address(0), \"BentoBox: to[0] not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        uint256 totalAmount;\n        uint256 len = tos.length;\n        for (uint256 i = 0; i < len; i++) {\n            address to = tos[i];\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\n            totalAmount = totalAmount.add(shares[i]);\n            emit LogTransfer(token, from, to, shares[i]);\n        }\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\n    }\n\n    /// @notice Flashloan ability.\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\n    /// @param receiver Address of the token receiver.\n    /// @param token The address of the token to receive.\n    /// @param amount of the tokens to receive.\n    /// @param data The calldata to pass to the `borrower` contract.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Not possible to follow this here, reentrancy has been reviewed\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\n    function flashLoan(\n        IFlashBorrower borrower,\n        address receiver,\n        IERC20 token,\n        uint256 amount,\n        bytes calldata data\n    ) public {\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\n        token.safeTransfer(receiver, amount);\n\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\n\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \"BentoBox: Wrong amount\");\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\n    }\n\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\n    /// @param tokens The addresses of the tokens.\n    /// @param amounts of the tokens for each receiver.\n    /// @param data The calldata to pass to the `borrower` contract.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Not possible to follow this here, reentrancy has been reviewed\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\n    function batchFlashLoan(\n        IBatchFlashBorrower borrower,\n        address[] calldata receivers,\n        IERC20[] calldata tokens,\n        uint256[] calldata amounts,\n        bytes calldata data\n    ) public {\n        uint256[] memory fees = new uint256[](tokens.length);\n\n        uint256 len = tokens.length;\n        for (uint256 i = 0; i < len; i++) {\n            uint256 amount = amounts[i];\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\n\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\n        }\n\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\n\n        for (uint256 i = 0; i < len; i++) {\n            IERC20 token = tokens[i];\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \"BentoBox: Wrong amount\");\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\n        }\n    }\n\n    /// @notice Sets the target percentage of the strategy for `token`.\n    /// @dev Only the owner of this contract is allowed to change this.\n    /// @param token The address of the token that maps to a strategy to change.\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\n        // Checks\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \"StrategyManager: Target too high\");\n\n        // Effects\n        strategyData[token].targetPercentage = targetPercentage_;\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\n    }\n\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\n    /// Must be called twice with the same arguments.\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\n    /// @dev Only the owner of this contract is allowed to change this.\n    /// @param token The address of the token that maps to a strategy to change.\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\n        StrategyData memory data = strategyData[token];\n        IStrategy pending = pendingStrategy[token];\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\n            pendingStrategy[token] = newStrategy;\n            // C1 - All math done through BoringMath (SWC-101)\n            // C1: Our sun will swallow the earth well before this overflows\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\n            emit LogStrategyQueued(token, newStrategy);\n        } else {\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \"StrategyManager: Too early\");\n            if (address(strategy[token]) != address(0)) {\n                int256 balanceChange = strategy[token].exit(data.balance);\n                // Effects\n                if (balanceChange > 0) {\n                    uint256 add = uint256(balanceChange);\n                    totals[token].addElastic(add);\n                    emit LogStrategyProfit(token, add);\n                } else if (balanceChange < 0) {\n                    uint256 sub = uint256(-balanceChange);\n                    totals[token].subElastic(sub);\n                    emit LogStrategyLoss(token, sub);\n                }\n\n                emit LogStrategyDivest(token, data.balance);\n            }\n            strategy[token] = pending;\n            data.strategyStartDate = 0;\n            data.balance = 0;\n            pendingStrategy[token] = IStrategy(0);\n            emit LogStrategySet(token, newStrategy);\n        }\n        strategyData[token] = data;\n    }\n\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\n    /// Optionally does housekeeping if `balance` is true.\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\n    /// @param token The address of the token for which a strategy is deployed.\n    /// @param balance True if housekeeping should be done.\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\n    function harvest(\n        IERC20 token,\n        bool balance,\n        uint256 maxChangeAmount\n    ) public {\n        StrategyData memory data = strategyData[token];\n        IStrategy _strategy = strategy[token];\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\n        if (balanceChange == 0 && !balance) {\n            return;\n        }\n\n        uint256 totalElastic = totals[token].elastic;\n\n        if (balanceChange > 0) {\n            uint256 add = uint256(balanceChange);\n            totalElastic = totalElastic.add(add);\n            totals[token].elastic = totalElastic.to128();\n            emit LogStrategyProfit(token, add);\n        } else if (balanceChange < 0) {\n            // C1 - All math done through BoringMath (SWC-101)\n            // C1: balanceChange could overflow if it's max negative int128.\n            // But tokens with balances that large are not supported by the BentoBox.\n            uint256 sub = uint256(-balanceChange);\n            totalElastic = totalElastic.sub(sub);\n            totals[token].elastic = totalElastic.to128();\n            data.balance = data.balance.sub(sub.to128());\n            emit LogStrategyLoss(token, sub);\n        }\n\n        if (balance) {\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\n            // if data.balance == targetBalance there is nothing to update\n            if (data.balance < targetBalance) {\n                uint256 amountOut = targetBalance.sub(data.balance);\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\n                    amountOut = maxChangeAmount;\n                }\n                token.safeTransfer(address(_strategy), amountOut);\n                data.balance = data.balance.add(amountOut.to128());\n                _strategy.skim(amountOut);\n                emit LogStrategyInvest(token, amountOut);\n            } else if (data.balance > targetBalance) {\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\n                    amountIn = maxChangeAmount;\n                }\n\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\n\n                data.balance = data.balance.sub(actualAmountIn.to128());\n                emit LogStrategyDivest(token, actualAmountIn);\n            }\n        }\n\n        strategyData[token] = data;\n    }\n\n    // Contract should be able to receive ETH deposits to support deposit & skim\n    // solhint-disable-next-line no-empty-blocks\n    receive() external payable {}\n}\n"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 99999
      },
      "outputSelection": {
        "*": {
          "*": [
            "abi",
            "evm.bytecode",
            "evm.deployedBytecode",
            "evm.methodIdentifiers",
            "metadata",
            "devdoc",
            "userdoc",
            "storageLayout",
            "evm.gasEstimates"
          ],
          "": [
            "ast"
          ]
        }
      },
      "metadata": {
        "useLiteralContent": true
      }
    }
  },
  "output": {
    "contracts": {
      "contracts/flat/BentoBoxV1Flat.sol": {
        "BaseBoringBatchable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes[]",
                  "name": "calls",
                  "type": "bytes[]"
                },
                {
                  "internalType": "bool",
                  "name": "revertOnFail",
                  "type": "bool"
                }
              ],
              "name": "batch",
              "outputs": [
                {
                  "internalType": "bool[]",
                  "name": "successes",
                  "type": "bool[]"
                },
                {
                  "internalType": "bytes[]",
                  "name": "results",
                  "type": "bytes[]"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "batch(bytes[],bool)": {
                "params": {
                  "calls": "An array of inputs for each call.",
                  "revertOnFail": "If True then reverts after a failed call and stops doing further calls."
                },
                "returns": {
                  "results": "An array with the returned data of each function call, mapped one-to-one to `calls`.",
                  "successes": "An array indicating the success of a call, mapped one-to-one to `calls`."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061058e806100206000396000f3fe60806040526004361061001e5760003560e01c8063d2423b5114610023575b600080fd5b61003661003136600461026a565b61004d565b604051610044929190610401565b60405180910390f35b6060808367ffffffffffffffff8111801561006757600080fd5b50604051908082528060200260200182016040528015610091578160200160208202803683370190505b5091508367ffffffffffffffff811180156100ab57600080fd5b506040519080825280602002602001820160405280156100df57816020015b60608152602001906001900390816100ca5790505b50905060005b848110156101f95760006060308888858181106100fe57fe5b905060200281019061011091906104b5565b60405161011e9291906103f1565b600060405180830381855af49150503d8060008114610159576040519150601f19603f3d011682016040523d82523d6000602084013e61015e565b606091505b5091509150818061016d575085155b61017682610202565b906101b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ae919061049b565b60405180910390fd5b50818584815181106101c557fe5b602002602001019015159081151581525050808484815181106101e457fe5b602090810291909101015250506001016100e5565b50935093915050565b6060604482511015610248575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152610265565b6004820191508180602001905181019061026291906102ee565b90505b919050565b60008060006040848603121561027e578283fd5b833567ffffffffffffffff80821115610295578485fd5b818601915086601f8301126102a8578485fd5b8135818111156102b6578586fd5b87602080830285010111156102c9578586fd5b6020928301955093505084013580151581146102e3578182fd5b809150509250925092565b6000602082840312156102ff578081fd5b815167ffffffffffffffff80821115610316578283fd5b818401915084601f830112610329578283fd5b815181811115610337578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610375578586fd5b60405281815283820160200187101561038c578485fd5b61039d826020830160208701610528565b9695505050505050565b600081518084526103bf816020860160208601610528565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b604080825283519082018190526000906020906060840190828701845b8281101561043c57815115158452928401929084019060010161041e565b50505083810382850152808551610453818461051f565b91508192508381028201848801865b8381101561048c57858303855261047a8383516103a7565b94870194925090860190600101610462565b50909998505050505050505050565b6000602082526104ae60208301846103a7565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126104e9578283fd5b83018035915067ffffffffffffffff821115610503578283fd5b60200191503681900382131561051857600080fd5b9250929050565b90815260200190565b60005b8381101561054357818101518382015260200161052b565b83811115610552576000848401525b5050505056fea264697066735822122094b93975047667261cf24adbee445d0c306f3e3b4541b9763c4775ccf46b3d9b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x58E DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x23 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x36 PUSH2 0x31 CALLDATASIZE PUSH1 0x4 PUSH2 0x26A JUMP JUMPDEST PUSH2 0x4D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x44 SWAP3 SWAP2 SWAP1 PUSH2 0x401 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x91 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xDF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xCA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1F9 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0xFE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x110 SWAP2 SWAP1 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x11E SWAP3 SWAP2 SWAP1 PUSH2 0x3F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x159 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x15E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x16D JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x176 DUP3 PUSH2 0x202 JUMP JUMPDEST SWAP1 PUSH2 0x1B7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1AE SWAP2 SWAP1 PUSH2 0x49B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1C5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1E4 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0xE5 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x248 JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x265 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x262 SWAP2 SWAP1 PUSH2 0x2EE JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x27E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x295 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2A8 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2B6 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x2C9 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2E3 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2FF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x316 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x329 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x337 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x375 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x38C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x39D DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x528 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x3BF DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x528 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x43C JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x41E JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x453 DUP2 DUP5 PUSH2 0x51F JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x48C JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x47A DUP4 DUP4 MLOAD PUSH2 0x3A7 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x4AE PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x3A7 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4E9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x503 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x543 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x52B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 0xB9 CODECOPY PUSH22 0x47667261CF24ADBEE445D0C306F3E3B4541B9763C47 PUSH22 0xCCF46B3D9B64736F6C634300060C0033000000000000 ",
              "sourceMap": "24618:2061:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "60806040526004361061001e5760003560e01c8063d2423b5114610023575b600080fd5b61003661003136600461026a565b61004d565b604051610044929190610401565b60405180910390f35b6060808367ffffffffffffffff8111801561006757600080fd5b50604051908082528060200260200182016040528015610091578160200160208202803683370190505b5091508367ffffffffffffffff811180156100ab57600080fd5b506040519080825280602002602001820160405280156100df57816020015b60608152602001906001900390816100ca5790505b50905060005b848110156101f95760006060308888858181106100fe57fe5b905060200281019061011091906104b5565b60405161011e9291906103f1565b600060405180830381855af49150503d8060008114610159576040519150601f19603f3d011682016040523d82523d6000602084013e61015e565b606091505b5091509150818061016d575085155b61017682610202565b906101b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ae919061049b565b60405180910390fd5b50818584815181106101c557fe5b602002602001019015159081151581525050808484815181106101e457fe5b602090810291909101015250506001016100e5565b50935093915050565b6060604482511015610248575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152610265565b6004820191508180602001905181019061026291906102ee565b90505b919050565b60008060006040848603121561027e578283fd5b833567ffffffffffffffff80821115610295578485fd5b818601915086601f8301126102a8578485fd5b8135818111156102b6578586fd5b87602080830285010111156102c9578586fd5b6020928301955093505084013580151581146102e3578182fd5b809150509250925092565b6000602082840312156102ff578081fd5b815167ffffffffffffffff80821115610316578283fd5b818401915084601f830112610329578283fd5b815181811115610337578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610375578586fd5b60405281815283820160200187101561038c578485fd5b61039d826020830160208701610528565b9695505050505050565b600081518084526103bf816020860160208601610528565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b604080825283519082018190526000906020906060840190828701845b8281101561043c57815115158452928401929084019060010161041e565b50505083810382850152808551610453818461051f565b91508192508381028201848801865b8381101561048c57858303855261047a8383516103a7565b94870194925090860190600101610462565b50909998505050505050505050565b6000602082526104ae60208301846103a7565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126104e9578283fd5b83018035915067ffffffffffffffff821115610503578283fd5b60200191503681900382131561051857600080fd5b9250929050565b90815260200190565b60005b8381101561054357818101518382015260200161052b565b83811115610552576000848401525b5050505056fea264697066735822122094b93975047667261cf24adbee445d0c306f3e3b4541b9763c4775ccf46b3d9b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x23 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x36 PUSH2 0x31 CALLDATASIZE PUSH1 0x4 PUSH2 0x26A JUMP JUMPDEST PUSH2 0x4D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x44 SWAP3 SWAP2 SWAP1 PUSH2 0x401 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x91 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xDF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xCA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1F9 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0xFE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x110 SWAP2 SWAP1 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x11E SWAP3 SWAP2 SWAP1 PUSH2 0x3F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x159 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x15E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x16D JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x176 DUP3 PUSH2 0x202 JUMP JUMPDEST SWAP1 PUSH2 0x1B7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1AE SWAP2 SWAP1 PUSH2 0x49B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1C5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1E4 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0xE5 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x248 JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x265 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x262 SWAP2 SWAP1 PUSH2 0x2EE JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x27E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x295 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2A8 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2B6 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x2C9 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2E3 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2FF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x316 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x329 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x337 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x375 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x38C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x39D DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x528 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x3BF DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x528 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x43C JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x41E JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x453 DUP2 DUP5 PUSH2 0x51F JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x48C JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x47A DUP4 DUP4 MLOAD PUSH2 0x3A7 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x4AE PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x3A7 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4E9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x503 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x543 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x52B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 0xB9 CODECOPY PUSH22 0x47667261CF24ADBEE445D0C306F3E3B4541B9763C47 PUSH22 0xCCF46B3D9B64736F6C634300060C0033000000000000 ",
              "sourceMap": "24618:2061:0:-:0;;;;;;;;;;;;;;;;;;;;;26156:521;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;26240:23;;26322:5;26311:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26311:24:0;-1:-1:-1;26299:36:0;-1:-1:-1;26367:5:0;26355:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26345:35;;26395:9;26390:281;26410:16;;;26390:281;;;26448:12;26462:19;26493:4;26512:5;;26518:1;26512:8;;;;;;;;;;;;;;;;;;:::i;:::-;26485:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26447:74;;;;26543:7;:24;;;;26555:12;26554:13;26543:24;26569:21;26583:6;26569:13;:21::i;:::-;26535:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26620:7;26605:9;26615:1;26605:12;;;;;;;;;;;;;:22;;;;;;;;;;;26654:6;26641:7;26649:1;26641:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;26428:3:0;;26390:281;;;;26156:521;;;;;;:::o;24840:487::-;24912:13;25073:2;25052:11;:18;:23;25048:67;;;-1:-1:-1;25077:38:0;;;;;;;;;;;;;;;;;;;25048:67;25215:4;25202:11;25198:22;25183:37;;25257:11;25246:33;;;;;;;;;;;;:::i;:::-;25239:40;;24840:487;;;;:::o;976:538:-1:-;;;;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;-1:-1;;1146:12;1108:2;1204:17;1191:31;1242:18;;1234:6;1231:30;1228:2;;;-1:-1;;1264:12;1228:2;1376:6;1365:9;1361:22;;;162:3;155:4;147:6;143:17;139:27;129:2;;-1:-1;;170:12;129:2;213:6;200:20;1242:18;232:6;229:30;226:2;;;-1:-1;;262:12;226:2;357:3;306:4;;341:6;337:17;298:6;323:32;;320:41;317:2;;;-1:-1;;364:12;317:2;306:4;294:17;;;;-1:-1;1284:109;-1:-1;;1466:22;;456:20;9459:13;;9452:21;10077:32;;10067:2;;-1:-1;;10113:12;10067:2;1438:60;;;;1102:412;;;;;:::o;1521:362::-;;1646:2;1634:9;1625:7;1621:23;1617:32;1614:2;;;-1:-1;;1652:12;1614:2;1703:17;1697:24;1741:18;;1733:6;1730:30;1727:2;;;-1:-1;;1763:12;1727:2;1850:6;1839:9;1835:22;;;637:3;630:4;622:6;618:17;614:27;604:2;;-1:-1;;645:12;604:2;685:6;679:13;1741:18;7225:6;7222:30;7219:2;;;-1:-1;;7255:12;7219:2;6888;6882:9;1646:2;7328:9;630:4;7313:6;7309:17;7305:33;6918:6;6914:17;;7025:6;7013:10;7010:22;1741:18;6977:10;6974:34;6971:62;6968:2;;;-1:-1;;7036:12;6968:2;6888;7055:22;778:21;;;878:16;;;1646:2;878:16;875:25;-1:-1;872:2;;;-1:-1;;903:12;872:2;923:39;955:6;1646:2;854:5;850:16;1646:2;820:6;816:17;923:39;:::i;:::-;1783:84;1608:275;-1:-1;;;;;;1608:275::o;4354:323::-;;4486:5;7840:12;8655:6;8650:3;8643:19;4569:52;4614:6;8692:4;8687:3;8683:14;8692:4;4595:5;4591:16;4569:52;:::i;:::-;10004:2;9984:14;10000:7;9980:28;4633:39;;;;8692:4;4633:39;;4434:243;-1:-1;;4434:243::o;5038:291::-;;9567:6;9562:3;9557;9544:30;9605:16;;9598:27;;;9605:16;5182:147;-1:-1;5182:147::o;5336:653::-;5603:2;5617:47;;;7840:12;;5588:18;;;8643:19;;;5336:653;;8692:4;;8683:14;;;;7530;;;5336:653;2676:251;2701:6;2698:1;2695:13;2676:251;;;2762:13;;9459;9452:21;3967:34;;2032:14;;;;8377;;;;2723:1;2716:9;2676:251;;;2680:14;;;5828:9;5822:4;5818:20;8692:4;5802:9;5798:18;5791:48;5853:126;3204:5;7840:12;3223:95;3311:6;3306:3;3223:95;:::i;:::-;3216:102;;;;;8692:4;3375:6;3371:17;3366:3;3362:27;8692:4;3469:5;7530:14;-1:-1;3508:357;3533:6;3530:1;3527:13;3508:357;;;3595:9;3589:4;3585:20;3580:3;3573:33;2180:64;2240:3;3640:6;3634:13;2180:64;:::i;:::-;3844:14;;;;3654:90;-1:-1;8377:14;;;;2723:1;3548:9;3508:357;;;-1:-1;5845:134;;5574:415;-1:-1;;;;;;;;;5574:415::o;5996:310::-;;6143:2;6164:17;6157:47;6218:78;6143:2;6132:9;6128:18;6282:6;6218:78;:::i;:::-;6210:86;6114:192;-1:-1;;;6114:192::o;6313:506::-;;;6448:11;6435:25;6499:48;6523:8;6507:14;6503:29;6499:48;6479:18;6475:73;6465:2;;-1:-1;;6552:12;6465:2;6579:33;;6633:18;;;-1:-1;6671:18;6660:30;;6657:2;;;-1:-1;;6693:12;6657:2;6538:4;6721:13;;-1:-1;6507:14;6753:38;;;6743:49;;6740:2;;;6805:1;;6795:12;6740:2;6403:416;;;;;:::o;8528:175::-;8643:19;;;8692:4;8683:14;;8636:67::o;9640:268::-;9705:1;9712:101;9726:6;9723:1;9720:13;9712:101;;;9793:11;;;9787:18;9774:11;;;9767:39;9748:2;9741:10;9712:101;;;9828:6;9825:1;9822:13;9819:2;;;9705:1;9884:6;9879:3;9875:16;9868:27;9819:2;;9689:219;;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "284400",
                "executionCost": "324",
                "totalCost": "284724"
              },
              "external": {
                "batch(bytes[],bool)": "infinite"
              },
              "internal": {
                "_getRevertMsg(bytes memory)": "infinite"
              }
            },
            "methodIdentifiers": {
              "batch(bytes[],bool)": "d2423b51"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"},{\"internalType\":\"bool\",\"name\":\"revertOnFail\",\"type\":\"bool\"}],\"name\":\"batch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batch(bytes[],bool)\":{\"params\":{\"calls\":\"An array of inputs for each call.\",\"revertOnFail\":\"If True then reverts after a failed call and stops doing further calls.\"},\"returns\":{\"results\":\"An array with the returned data of each function call, mapped one-to-one to `calls`.\",\"successes\":\"An array indicating the success of a call, mapped one-to-one to `calls`.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batch(bytes[],bool)\":{\"notice\":\"Allows batched call to self (this contract).\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BaseBoringBatchable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "batch(bytes[],bool)": {
                "notice": "Allows batched call to self (this contract)."
              }
            },
            "version": 1
          }
        },
        "BentoBoxV1": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "wethToken_",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "name": "LogDeploy",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogDeposit",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "borrower",
                  "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"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "receiver",
                  "type": "address"
                }
              ],
              "name": "LogFlashLoan",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "protocol",
                  "type": "address"
                }
              ],
              "name": "LogRegisterProtocol",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogSetMasterContractApproval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyDivest",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyInvest",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyLoss",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyProfit",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract IStrategy",
                  "name": "strategy",
                  "type": "address"
                }
              ],
              "name": "LogStrategyQueued",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract IStrategy",
                  "name": "strategy",
                  "type": "address"
                }
              ],
              "name": "LogStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "targetPercentage",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyTargetPercentage",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogTransfer",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogWhiteListMasterContract",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogWithdraw",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes[]",
                  "name": "calls",
                  "type": "bytes[]"
                },
                {
                  "internalType": "bool",
                  "name": "revertOnFail",
                  "type": "bool"
                }
              ],
              "name": "batch",
              "outputs": [
                {
                  "internalType": "bool[]",
                  "name": "successes",
                  "type": "bool[]"
                },
                {
                  "internalType": "bytes[]",
                  "name": "results",
                  "type": "bytes[]"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IBatchFlashBorrower",
                  "name": "borrower",
                  "type": "address"
                },
                {
                  "internalType": "address[]",
                  "name": "receivers",
                  "type": "address[]"
                },
                {
                  "internalType": "contract IERC20[]",
                  "name": "tokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "amounts",
                  "type": "uint256[]"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "batchFlashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "claimOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "internalType": "bool",
                  "name": "useCreate2",
                  "type": "bool"
                }
              ],
              "name": "deploy",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "deposit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "amountOut",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareOut",
                  "type": "uint256"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IFlashBorrower",
                  "name": "borrower",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "receiver",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "flashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "balance",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "maxChangeAmount",
                  "type": "uint256"
                }
              ],
              "name": "harvest",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractApproved",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "pendingStrategy",
              "outputs": [
                {
                  "internalType": "contract IStrategy",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "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": "permitToken",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "registerProtocol",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "setMasterContractApproval",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "contract IStrategy",
                  "name": "newStrategy",
                  "type": "address"
                }
              ],
              "name": "setStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint64",
                  "name": "targetPercentage_",
                  "type": "uint64"
                }
              ],
              "name": "setStrategyTargetPercentage",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "strategy",
              "outputs": [
                {
                  "internalType": "contract IStrategy",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "strategyData",
              "outputs": [
                {
                  "internalType": "uint64",
                  "name": "strategyStartDate",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "targetPercentage",
                  "type": "uint64"
                },
                {
                  "internalType": "uint128",
                  "name": "balance",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "roundUp",
                  "type": "bool"
                }
              ],
              "name": "toAmount",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "roundUp",
                  "type": "bool"
                }
              ],
              "name": "toShare",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "totals",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "elastic",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "base",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address[]",
                  "name": "tos",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "shares",
                  "type": "uint256[]"
                }
              ],
              "name": "transferMultiple",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "direct",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "renounce",
                  "type": "bool"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "whitelistMasterContract",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "whitelistedMasterContracts",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "amountOut",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareOut",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "stateMutability": "payable",
              "type": "receive"
            }
          ],
          "devdoc": {
            "author": "BoringCrypto, Keno",
            "kind": "dev",
            "methods": {
              "batch(bytes[],bool)": {
                "params": {
                  "calls": "An array of inputs for each call.",
                  "revertOnFail": "If True then reverts after a failed call and stops doing further calls."
                },
                "returns": {
                  "results": "An array with the returned data of each function call, mapped one-to-one to `calls`.",
                  "successes": "An array indicating the success of a call, mapped one-to-one to `calls`."
                }
              },
              "batchFlashLoan(address,address[],address[],uint256[],bytes)": {
                "params": {
                  "amounts": "of the tokens for each receiver.",
                  "borrower": "The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.",
                  "data": "The calldata to pass to the `borrower` contract.",
                  "receivers": "An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.",
                  "tokens": "The addresses of the tokens."
                }
              },
              "deploy(address,bytes,bool)": {
                "params": {
                  "data": "Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.",
                  "masterContract": "The address of the contract to clone.",
                  "useCreate2": "Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt."
                },
                "returns": {
                  "cloneAddress": "Address of the created clone contract."
                }
              },
              "deposit(address,address,address,uint256,uint256)": {
                "params": {
                  "amount": "Token amount in native representation to deposit.",
                  "from": "which account to pull the tokens.",
                  "share": "Token amount represented in shares to deposit. Takes precedence over `amount`.",
                  "to": "which account to push the tokens.",
                  "token_": "The ERC-20 token to deposit."
                },
                "returns": {
                  "amountOut": "The amount deposited.",
                  "shareOut": "The deposited amount represented in shares."
                }
              },
              "flashLoan(address,address,address,uint256,bytes)": {
                "params": {
                  "amount": "of the tokens to receive.",
                  "borrower": "The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.",
                  "data": "The calldata to pass to the `borrower` contract.",
                  "receiver": "Address of the token receiver.",
                  "token": "The address of the token to receive."
                }
              },
              "harvest(address,bool,uint256)": {
                "params": {
                  "balance": "True if housekeeping should be done.",
                  "maxChangeAmount": "The maximum amount for either pulling or pushing from/to the `IStrategy` contract.",
                  "token": "The address of the token for which a strategy is deployed."
                }
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "params": {
                  "approved": "If True approves access. If False revokes access.",
                  "masterContract": "The address who gains or loses access.",
                  "r": "Part of the signature. (See EIP-191)",
                  "s": "Part of the signature. (See EIP-191)",
                  "user": "The address of the user that approves or revokes access.",
                  "v": "Part of the signature. (See EIP-191)"
                }
              },
              "setStrategy(address,address)": {
                "details": "Only the owner of this contract is allowed to change this.",
                "params": {
                  "newStrategy": "The address of the contract that conforms to `IStrategy`.",
                  "token": "The address of the token that maps to a strategy to change."
                }
              },
              "setStrategyTargetPercentage(address,uint64)": {
                "details": "Only the owner of this contract is allowed to change this.",
                "params": {
                  "targetPercentage_": "The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.",
                  "token": "The address of the token that maps to a strategy to change."
                }
              },
              "toAmount(address,uint256,bool)": {
                "details": "Helper function represent shares back into the `token` amount.",
                "params": {
                  "roundUp": "If the result should be rounded up.",
                  "share": "The amount of shares.",
                  "token": "The ERC-20 token."
                },
                "returns": {
                  "amount": "The share amount back into native representation."
                }
              },
              "toShare(address,uint256,bool)": {
                "details": "Helper function to represent an `amount` of `token` in shares.",
                "params": {
                  "amount": "The `token` amount.",
                  "roundUp": "If the result `share` should be rounded up.",
                  "token": "The ERC-20 token."
                },
                "returns": {
                  "share": "The token amount represented in shares."
                }
              },
              "transfer(address,address,address,uint256)": {
                "params": {
                  "from": "which user to pull the tokens.",
                  "share": "The amount of `token` in shares.",
                  "to": "which user to push the tokens.",
                  "token": "The ERC-20 token to transfer."
                }
              },
              "transferMultiple(address,address,address[],uint256[])": {
                "params": {
                  "from": "which user to pull the tokens.",
                  "shares": "The amount of `token` in shares for each receiver in `tos`.",
                  "token": "The ERC-20 token to transfer.",
                  "tos": "The receivers of the tokens."
                }
              },
              "transferOwnership(address,bool,bool)": {
                "params": {
                  "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
                  "newOwner": "Address of the new owner.",
                  "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                }
              },
              "withdraw(address,address,address,uint256,uint256)": {
                "params": {
                  "amount": "of tokens. Either one of `amount` or `share` needs to be supplied.",
                  "from": "which user to pull the tokens.",
                  "share": "Like above, but `share` takes precedence over `amount`.",
                  "to": "which user to push the tokens.",
                  "token_": "The ERC-20 token to withdraw."
                }
              }
            },
            "title": "BentoBox",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60e06040523480156200001157600080fd5b5060405162005ad838038062005ad8833981016040819052620000349162000116565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a34660a081905262000084816200009e565b6080525060601b6001600160601b03191660c0526200016a565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f8330604051602001620000f9949392919062000146565b604051602081830303815290604052805190602001209050919050565b60006020828403121562000128578081fd5b81516001600160a01b03811681146200013f578182fd5b9392505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805160a05160c05160601c61592f620001a9600039806107615280610b3752806129105280612bd65250806114845250806114b9525061592f6000f3fe6080604052600436106101dc5760003560e01c80637c516e9411610102578063d2423b5111610095578063f1676d3711610064578063f1676d3714610555578063f18d03cc14610575578063f483b3da14610595578063f7888aec146105b5576101e3565b8063d2423b51146104d0578063da5139ca146104f1578063df23b45b14610511578063e30c397814610540576101e3565b806397da6d30116100d157806397da6d301461045b578063aee4d1b21461047b578063bafe4f1414610490578063c0a47c93146104b0576101e3565b80637c516e94146103e65780637ecebe00146104065780638da5cb5b1461042657806391e0eab51461043b576101e3565b80633e2a9d4e1161017a5780635662311811610149578063566231181461036657806366c6bb0b1461038657806372cb5d97146103a6578063733a9d7c146103c6576101e3565b80633e2a9d4e146102e35780634e71e0c8146103035780634ffe34db146103185780635108a55814610346576101e3565b806312a90c8a116101b657806312a90c8a146102545780631f54245b14610281578063228bfd9f146102a15780633644e515146102c1576101e3565b806302b9446c146101e8578063078dfbe7146102125780630fca884314610234576101e3565b366101e357005b600080fd5b6101fb6101f6366004614929565b6105d5565b6040516102099291906157da565b60405180910390f35b34801561021e57600080fd5b5061023261022d3660046146dd565b610c8c565b005b34801561024057600080fd5b5061023261024f366004614a04565b610e17565b34801561026057600080fd5b5061027461026f3660046145f0565b6111d9565b6040516102099190615066565b61029461028f366004614727565b6111ee565b6040516102099190614dc7565b3480156102ad57600080fd5b506102946102bc3660046145f0565b611457565b3480156102cd57600080fd5b506102d661147f565b6040516102099190615071565b3480156102ef57600080fd5b506102326102fe366004614b0c565b6114df565b34801561030f57600080fd5b50610232611613565b34801561032457600080fd5b506103386103333660046145f0565b6116f9565b6040516102099291906157b7565b34801561035257600080fd5b506102946103613660046145f0565b611735565b34801561037257600080fd5b506102d6610381366004614ad6565b61175d565b34801561039257600080fd5b506102326103a1366004614a96565b6117d4565b3480156103b257600080fd5b506102326103c13660046148c7565b611f89565b3480156103d257600080fd5b506102326103e13660046146b0565b612588565b3480156103f257600080fd5b50610232610401366004614983565b6126a5565b34801561041257600080fd5b506102d66104213660046145f0565b61273f565b34801561043257600080fd5b50610294612751565b34801561044757600080fd5b5061027461045636600461460c565b61276d565b34801561046757600080fd5b506101fb610476366004614929565b61278d565b34801561048757600080fd5b50610232612d7d565b34801561049c57600080fd5b506102946104ab3660046145f0565b612ddc565b3480156104bc57600080fd5b506102326104cb366004614644565b612e04565b6104e36104de36600461478d565b61325d565b604051610209929190614fcc565b3480156104fd57600080fd5b506102d661050c366004614ad6565b613409565b34801561051d57600080fd5b5061053161052c3660046145f0565b613478565b604051610209939291906157fd565b34801561054c57600080fd5b506102946134cd565b34801561056157600080fd5b50610232610570366004614b45565b6134e9565b34801561058157600080fd5b506102326105903660046148d9565b6136c4565b3480156105a157600080fd5b506102326105b03660046147f3565b61391e565b3480156105c157600080fd5b506102d66105d03660046148c7565b613c69565b6000808573ffffffffffffffffffffffffffffffffffffffff81163314801590610615575073ffffffffffffffffffffffffffffffffffffffff81163014155b156106ee573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610680576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff166106ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b73ffffffffffffffffffffffffffffffffffffffff861661073b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061538e565b600073ffffffffffffffffffffffffffffffffffffffff89161561075f5788610781565b7f00000000000000000000000000000000000000000000000000000000000000005b905061078b614514565b5073ffffffffffffffffffffffffffffffffffffffff81166000908152600760209081526040918290208251808401909352546fffffffffffffffffffffffffffffffff808216808552700100000000000000000000000000000000909204169183019190915215158061087c575060008273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561084257600080fd5b505afa158015610856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087a9190614bb6565b115b6108b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906152b2565b8561091c576108c381886000613c86565b95506103e86108f16108d488613d44565b60208401516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff16101561091757600080945094505050610c81565b61092b565b61092881876001613dec565b96505b73ffffffffffffffffffffffffffffffffffffffff891630141580610964575073ffffffffffffffffffffffffffffffffffffffff8a16155b8061099557508051610991906fffffffffffffffffffffffffffffffff1661098b84613e8f565b90613f73565b8711155b6109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615168565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660209081526040808320938c1683529290522054610a089087613fb0565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660209081526040808320938d1683529290522055610a64610a4787613d44565b60208301516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff166020820152610aa1610a8788613d44565b82516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff908116825273ffffffffffffffffffffffffffffffffffffffff808416600090815260076020908152604090912084518154928601518516700100000000000000000000000000000000029085167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217909316179091558a16610bbb577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b9d57600080fd5b505af1158015610bb1573d6000803e3d6000fd5b5050505050610bfa565b73ffffffffffffffffffffffffffffffffffffffff89163014610bfa57610bfa73ffffffffffffffffffffffffffffffffffffffff83168a308a613fed565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb2346165e782564f17f5b7e555c21f4fd96fbc93458572bf0113ea35a958fc558a8a604051610c709291906157da565b60405180910390a486945085935050505b509550959350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b8115610dd15773ffffffffffffffffffffffffffffffffffffffff8316151580610d045750805b610d3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061527b565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600180549091169055610e12565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b8473ffffffffffffffffffffffffffffffffffffffff81163314801590610e54575073ffffffffffffffffffffffffffffffffffffffff81163014155b15610f24573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff16610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b600085858281610f3057fe5b9050602002016020810190610f4591906145f0565b73ffffffffffffffffffffffffffffffffffffffff161415610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615357565b600084815b81811015611157576000888883818110610fae57fe5b9050602002016020810190610fc391906145f0565b9050611066878784818110610fd457fe5b90506020020135600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613fb090919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff808d166000908152600660209081526040808320938616835292905220556110be8787848181106110a857fe5b9050602002013585613fb090919063ffffffff16565b93508073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a8a8a8781811061113257fe5b905060200201356040516111469190615071565b60405180910390a450600101610f98565b5073ffffffffffffffffffffffffffffffffffffffff808a166000908152600660209081526040808320938c16835292905220546111959083613f73565b73ffffffffffffffffffffffffffffffffffffffff998a1660009081526006602090815260408083209b909c16825299909952989097209790975550505050505050565b60046020526000908152604090205460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff851661123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615542565b606085901b82156112c6576000858560405161125a929190614d71565b604051809103902090506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152816037826000f593505050611322565b6040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09250505b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600260205260409081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938a169390931790925590517f4ddf47d4000000000000000000000000000000000000000000000000000000008152634ddf47d49034906113b5908990899060040161510a565b6000604051808303818588803b1580156113ce57600080fd5b505af11580156113e2573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b878760405161144692919061510a565b60405180910390a350949350505050565b60086020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6000467f000000000000000000000000000000000000000000000000000000000000000081146114b7576114b281614158565b6114d9565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314611530576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b605f8167ffffffffffffffff161115611575576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061572d565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600a60205260409081902080547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff861602179055517f7543af99b5602c06e62da0631b5308489a5ff859150105a623b6eb15e8deae0b906116079084906157e8565b60405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff16338114611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615468565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b6007602052600090815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b60096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416918101919091526117cc908484613dec565b949350505050565b6117dc61452b565b5073ffffffffffffffffffffffffffffffffffffffff8381166000818152600a602090815260408083208151606081018352905467ffffffffffffffff8082168352680100000000000000008204168285015270010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16818301908152948452600890925280832054935190517f18fccc760000000000000000000000000000000000000000000000000000000081529194939093169283916318fccc76916118ab91339060040161577f565b602060405180830381600087803b1580156118c557600080fd5b505af11580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd9190614bb6565b90508015801561190b575084155b1561191857505050610e12565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600760205260408120546fffffffffffffffffffffffffffffffff1690821315611a1257816119638282613fb0565b915061196e82613d44565b73ffffffffffffffffffffffffffffffffffffffff89166000818152600760205260409081902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff949094169390931790925590517f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d290611a04908490615071565b60405180910390a250611b2d565b6000821215611b2d576000829003611a2a8282613f73565b9150611a3582613d44565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260076020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216919091179055611ac2611aa582613d44565b60408701516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff166040808701919091525173ffffffffffffffffffffffffffffffffffffffff8916907f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf9790611b23908490615071565b60405180910390a2505b8515611eb15760006064611b58866020015167ffffffffffffffff168461422190919063ffffffff16565b81611b5f57fe5b0490508085604001516fffffffffffffffffffffffffffffffff161015611cfe576000611bab86604001516fffffffffffffffffffffffffffffffff1683613f7390919063ffffffff16565b90508615801590611bbb57508681115b15611bc35750855b611be473ffffffffffffffffffffffffffffffffffffffff8a168683614272565b611c0d611bf082613d44565b60408801516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff16604080880191909152517f6939aaf500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690636939aaf590611c78908490600401615071565b600060405180830381600087803b158015611c9257600080fd5b505af1158015611ca6573d6000803e3d6000fd5b505050508873ffffffffffffffffffffffffffffffffffffffff167fb18e7e4f6eac147a63a3bb6beb2d9039c88698623aff3efc4febbc20b0164ee582604051611cf09190615071565b60405180910390a250611eaf565b8085604001516fffffffffffffffffffffffffffffffff161115611eaf576000611d47611d2a83613d44565b60408801516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff1690508615801590611d6957508681115b15611d715750855b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff871690632e1a7d4d90611dc6908590600401615071565b602060405180830381600087803b158015611de057600080fd5b505af1158015611df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e189190614bb6565b9050611e43611e2682613d44565b60408901516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff166040808901919091525173ffffffffffffffffffffffffffffffffffffffff8b16907f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a90611ea4908490615071565b60405180910390a250505b505b50505073ffffffffffffffffffffffffffffffffffffffff84166000908152600a6020908152604091829020835181549285015193909401516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000267ffffffffffffffff94851668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff959096167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941693909317939093169390931791909116179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b611fe261452b565b5073ffffffffffffffffffffffffffffffffffffffff8281166000818152600a602090815260408083208151606081018352905467ffffffffffffffff80821683526801000000000000000082048116838601527001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff16828401529484526009909252909120548151919316911615806120ac57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156121645773ffffffffffffffffffffffffffffffffffffffff848116600090815260096020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691851691909117905561210d426143da565b67ffffffffffffffff16825260405173ffffffffffffffffffffffffffffffffffffffff80851691908616907f6f7ccdf3f86039e5a1dcf6028bf7b4773cbf7a234716ba2e5392b12bb0f8558f90600090a36124b4565b815167ffffffffffffffff16158015906121895750815167ffffffffffffffff164210155b6121bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153c5565b73ffffffffffffffffffffffffffffffffffffffff84811660009081526008602052604090205416156124185773ffffffffffffffffffffffffffffffffffffffff808516600090815260086020526040808220548582015191517f7f8661a100000000000000000000000000000000000000000000000000000000815292931691637f8661a19161225391600401615762565b602060405180830381600087803b15801561226d57600080fd5b505af1158015612281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a59190614bb6565b905060008113156123365773ffffffffffffffffffffffffffffffffffffffff8516600090815260076020526040902081906122e1908261441e565b508573ffffffffffffffffffffffffffffffffffffffff167f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d2826040516123289190615071565b60405180910390a2506123c4565b60008112156123c45773ffffffffffffffffffffffffffffffffffffffff851660009081526007602052604081209082900390612373908261448c565b508573ffffffffffffffffffffffffffffffffffffffff167f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf97826040516123ba9190615071565b60405180910390a2505b8473ffffffffffffffffffffffffffffffffffffffff167f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a846040015160405161240e9190615762565b60405180910390a2505b73ffffffffffffffffffffffffffffffffffffffff808516600081815260086020908152604080832080548688167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091558388528782018490528484526009909252808320805490921690915551928616927f03e6352a885adc4cc54767592939c3b1bbd65685658c3beaaba66a888120e2179190a35b5073ffffffffffffffffffffffffffffffffffffffff929092166000908152600a6020908152604091829020845181549286015193909501517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff958616177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000009590931694909402919091176fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000091909216021790915550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b73ffffffffffffffffffffffffffffffffffffffff8216612626576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061519f565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e260090611607908490615066565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063d505accf90612703908a908a908a908a908a908a908a90600401614f58565b600060405180830381600087803b15801561271d57600080fd5b505af1158015612731573d6000803e3d6000fd5b505050505050505050505050565b60056020526000908152604090205481565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600360209081526000928352604080842090915290825290205460ff1681565b6000808573ffffffffffffffffffffffffffffffffffffffff811633148015906127cd575073ffffffffffffffffffffffffffffffffffffffff81163014155b1561289d573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff168061282f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff1661289b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b73ffffffffffffffffffffffffffffffffffffffff86166128ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061538e565b600073ffffffffffffffffffffffffffffffffffffffff89161561290e5788612930565b7f00000000000000000000000000000000000000000000000000000000000000005b905061293a614514565b5073ffffffffffffffffffffffffffffffffffffffff81166000908152600760209081526040918290208251808401909352546fffffffffffffffffffffffffffffffff80821684527001000000000000000000000000000000009091041690820152856129b5576129ae81886001613c86565b95506129c4565b6129c181876000613dec565b96505b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660209081526040808320938d1683529290522054612a019087613f73565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660209081526040808320938e1683529290522055612a5a612a4088613d44565b82516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff168152612a97612a7a87613d44565b60208301516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff16602082018190526103e8111580612ad4575060208101516fffffffffffffffffffffffffffffffff16155b612b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615244565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260076020908152604090912083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911790558a16612ce6576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90612c0b908a90600401615071565b600060405180830381600087803b158015612c2557600080fd5b505af1158015612c39573d6000803e3d6000fd5b5050505060008873ffffffffffffffffffffffffffffffffffffffff1688604051612c6390614dc4565b60006040518083038185875af1925050503d8060008114612ca0576040519150601f19603f3d011682016040523d82523d6000602084013e612ca5565b606091505b5050905080612ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906156bf565b50612d07565b612d0773ffffffffffffffffffffffffffffffffffffffff83168989614272565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fad9ab9ee6953d4d177f4a03b3a3ac3178ffcb9816319f348060194aa76b144868a8a604051610c709291906157da565b3360008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8516612e51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615577565b81158015612e5d575080155b8015612e6a575060ff8316155b15612f815773ffffffffffffffffffffffffffffffffffffffff86163314612ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906151d6565b73ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409020541615612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906154d4565b73ffffffffffffffffffffffffffffffffffffffff851660009081526004602052604090205460ff16612f7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615688565b6131be565b73ffffffffffffffffffffffffffffffffffffffff8616612fce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061561a565b60006040518060400160405280600281526020017f190100000000000000000000000000000000000000000000000000000000000081525061300e61147f565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade28761305a577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b161307c565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526005602090815260409182902080546001810190915591516130c39493928e928e928e92910161507a565b604051602081830303815290604052805190602001206040516020016130eb93929190614d9d565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161312894939291906150ec565b6020604051602081039080840390855afa15801561314a573d6000803e3d6000fd5b5050506020604051035190508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061550b565b50505b73ffffffffffffffffffffffffffffffffffffffff8581166000818152600360209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b0592579061324d908890615066565b60405180910390a3505050505050565b6060808367ffffffffffffffff8111801561327757600080fd5b506040519080825280602002602001820160405280156132a1578160200160208202803683370190505b5091508367ffffffffffffffff811180156132bb57600080fd5b506040519080825280602002602001820160405280156132ef57816020015b60608152602001906001900390816132da5790505b50905060005b8481101561340057600060603088888581811061330e57fe5b90506020028101906133209190615833565b60405161332e929190614d71565b600060405180830381855af49150503d8060008114613369576040519150601f19603f3d011682016040523d82523d6000602084013e61336e565b606091505b5091509150818061337d575085155b613386826144b4565b906133be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677919061511e565b50818584815181106133cc57fe5b602002602001019015159081151581525050808484815181106133eb57fe5b602090810291909101015250506001016132f5565b50935093915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416918101919091526117cc908484613c86565b600a6020526000908152604090205467ffffffffffffffff808216916801000000000000000081049091169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000620186a06134fa856032614221565b8161350157fe5b04905061352573ffffffffffffffffffffffffffffffffffffffff86168786614272565b6040517f23e30c8b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906323e30c8b906135819033908990899087908a908a90600401614ed5565b600060405180830381600087803b15801561359b57600080fd5b505af11580156135af573d6000803e3d6000fd5b505050506135fc6135bf82613d44565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600760205260409020906fffffffffffffffffffffffffffffffff1661441e565b61360586613e8f565b101561363d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615651565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a22320487856040516136b39291906157da565b60405180910390a450505050505050565b8273ffffffffffffffffffffffffffffffffffffffff81163314801590613701575073ffffffffffffffffffffffffffffffffffffffff81163014155b156137d1573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680613763576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff166137cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b73ffffffffffffffffffffffffffffffffffffffff831661381e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061538e565b73ffffffffffffffffffffffffffffffffffffffff80861660009081526006602090815260408083209388168352929052205461385b9083613f73565b73ffffffffffffffffffffffffffffffffffffffff8681166000908152600660209081526040808320898516845290915280822093909355908516815220546138a49083613fb0565b73ffffffffffffffffffffffffffffffffffffffff80871660008181526006602090815260408083208986168085529252918290209490945551918716917f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a9061390f908790615071565b60405180910390a45050505050565b60608567ffffffffffffffff8111801561393757600080fd5b50604051908082528060200260200182016040528015613961578160200160208202803683370190505b5090508560005b81811015613a3d57600087878381811061397e57fe5b905060200201359050620186a061399f60328361422190919063ffffffff16565b816139a657fe5b048483815181106139b357fe5b602002602001018181525050613a348c8c848181106139ce57fe5b90506020020160208101906139e391906145f0565b8989858181106139ef57fe5b905060200201358c8c86818110613a0257fe5b9050602002016020810190613a1791906145f0565b73ffffffffffffffffffffffffffffffffffffffff169190614272565b50600101613968565b506040517fd9d1762300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c169063d9d1762390613a9e9033908c908c908c908c908a908d908d90600401614de8565b600060405180830381600087803b158015613ab857600080fd5b505af1158015613acc573d6000803e3d6000fd5b5050505060005b81811015612731576000898983818110613ae957fe5b9050602002016020810190613afe91906145f0565b9050613b5c613b1f858481518110613b1257fe5b6020026020010151613d44565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020906fffffffffffffffffffffffffffffffff1661441e565b613b6582613e8f565b1015613b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615651565b8b8b83818110613ba957fe5b9050602002016020810190613bbe91906145f0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a2232048b8b87818110613c2f57fe5b90506020020135888781518110613c4257fe5b6020026020010151604051613c589291906157da565b60405180910390a450600101613ad3565b600660209081526000928352604080842090915290825290205481565b82516000906fffffffffffffffffffffffffffffffff16613ca8575081613d3d565b835160208501516fffffffffffffffffffffffffffffffff91821691613cd091869116614221565b81613cd757fe5b049050818015613d2d57508284602001516fffffffffffffffffffffffffffffffff16613d2386600001516fffffffffffffffffffffffffffffffff168461422190919063ffffffff16565b81613d2a57fe5b04105b15613d3d576117cc816001613fb0565b9392505050565b60006fffffffffffffffffffffffffffffffff821115613d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906152e9565b5090565b8181016fffffffffffffffffffffffffffffffff8083169082161015613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615320565b92915050565b600083602001516fffffffffffffffffffffffffffffffff1660001415613e14575081613d3d565b602084015184516fffffffffffffffffffffffffffffffff91821691613e3c91869116614221565b81613e4357fe5b049050818015613d2d57508284600001516fffffffffffffffffffffffffffffffff16613d2386602001516fffffffffffffffffffffffffffffffff168461422190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a60205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081529192613de6927001000000000000000000000000000000009092046fffffffffffffffffffffffffffffffff16916370a0823190613f1d903090600401614dc7565b60206040518083038186803b158015613f3557600080fd5b505afa158015613f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f6d9190614bb6565b90613fb0565b80820382811115613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615131565b81810181811015613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615320565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b86868660405160240161402593929190614f27565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516140ae9190614d81565b6000604051808303816000865af19150503d80600081146140eb576040519150601f19603f3d011682016040523d82523d6000602084013e6140f0565b606091505b509150915081801561411a57508051158061411a57508080602001905181019061411a91906147d7565b614150576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155e5565b505050505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f83306040516020016141b194939291906150bb565b6040516020818303038152906040528051906020012090505b919050565b8082036fffffffffffffffffffffffffffffffff8084169082161115613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615131565b600081158061423c5750508082028282828161423957fe5b04145b613de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906156f6565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016142a8929190614fa6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516143319190614d81565b6000604051808303816000865af19150503d806000811461436e576040519150601f19603f3d011682016040523d82523d6000602084013e614373565b606091505b509150915081801561439d57508051158061439d57508080602001905181019061439d91906147d7565b6143d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061520d565b5050505050565b600067ffffffffffffffff821115613d90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061549d565b600061444661442c83613d44565b84546fffffffffffffffffffffffffffffffff1690613d94565b83547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff919091169081179093555090919050565b600061444661449a83613d44565b84546fffffffffffffffffffffffffffffffff16906141cf565b60606044825110156144fa575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526141ca565b60048201915081806020019051810190613de69190614bce565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b60008083601f84011261455c578182fd5b50813567ffffffffffffffff811115614573578182fd5b602083019150836020808302850101111561458d57600080fd5b9250929050565b60008083601f8401126145a5578182fd5b50813567ffffffffffffffff8111156145bc578182fd5b60208301915083602082850101111561458d57600080fd5b8035613de6816158c6565b803560ff81168114613de657600080fd5b600060208284031215614601578081fd5b8135613d3d816158c6565b6000806040838503121561461e578081fd5b8235614629816158c6565b91506020830135614639816158c6565b809150509250929050565b60008060008060008060c0878903121561465c578182fd5b8635614667816158c6565b95506020870135614677816158c6565b94506040870135614687816158eb565b935061469688606089016145df565b92506080870135915060a087013590509295509295509295565b600080604083850312156146c2578182fd5b82356146cd816158c6565b91506020830135614639816158eb565b6000806000606084860312156146f1578283fd5b83356146fc816158c6565b9250602084013561470c816158eb565b9150604084013561471c816158eb565b809150509250925092565b6000806000806060858703121561473c578384fd5b8435614747816158c6565b9350602085013567ffffffffffffffff811115614762578384fd5b61476e87828801614594565b9094509250506040850135614782816158eb565b939692955090935050565b6000806000604084860312156147a1578081fd5b833567ffffffffffffffff8111156147b7578182fd5b6147c38682870161454b565b909450925050602084013561471c816158eb565b6000602082840312156147e8578081fd5b8151613d3d816158eb565b600080600080600080600080600060a08a8c031215614810578687fd5b893561481b816158c6565b985060208a013567ffffffffffffffff80821115614837578889fd5b6148438d838e0161454b565b909a50985060408c013591508082111561485b578485fd5b6148678d838e0161454b565b909850965060608c013591508082111561487f578485fd5b61488b8d838e0161454b565b909650945060808c01359150808211156148a3578384fd5b506148b08c828d01614594565b915080935050809150509295985092959850929598565b6000806040838503121561461e578182fd5b600080600080608085870312156148ee578182fd5b84356148f9816158c6565b93506020850135614909816158c6565b92506040850135614919816158c6565b9396929550929360600135925050565b600080600080600060a08688031215614940578283fd5b853561494b816158c6565b9450602086013561495b816158c6565b9350604086013561496b816158c6565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b03121561499f578182fd5b88356149aa816158c6565b975060208901356149ba816158c6565b965060408901356149ca816158c6565b955060608901359450608089013593506149e78a60a08b016145df565b925060c0890135915060e089013590509295985092959890939650565b60008060008060008060808789031215614a1c578384fd5b8635614a27816158c6565b95506020870135614a37816158c6565b9450604087013567ffffffffffffffff80821115614a53578586fd5b614a5f8a838b0161454b565b90965094506060890135915080821115614a77578384fd5b50614a8489828a0161454b565b979a9699509497509295939492505050565b600080600060608486031215614aaa578081fd5b8335614ab5816158c6565b92506020840135614ac5816158eb565b929592945050506040919091013590565b600080600060608486031215614aea578081fd5b8335614af5816158c6565b925060208401359150604084013561471c816158eb565b60008060408385031215614b1e578182fd5b8235614b29816158c6565b9150602083013567ffffffffffffffff81168114614639578182fd5b60008060008060008060a08789031215614b5d578384fd5b8635614b68816158c6565b95506020870135614b78816158c6565b94506040870135614b88816158c6565b935060608701359250608087013567ffffffffffffffff811115614baa578283fd5b614a8489828a01614594565b600060208284031215614bc7578081fd5b5051919050565b600060208284031215614bdf578081fd5b815167ffffffffffffffff80821115614bf6578283fd5b818401915084601f830112614c09578283fd5b815181811115614c17578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715614c55578586fd5b604052818152838201602001871015614c6c578485fd5b614c7d826020830160208701615896565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff16815260200190565b6000815180845260208085019450808401835b83811015614cd457815187529582019590820190600101614cb8565b509495945050505050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008151808452614d3f816020860160208601615896565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b60008251614d93818460208701615896565b9190910192915050565b60008451614daf818460208901615896565b91909101928352506020820152604001919050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060a0820173ffffffffffffffffffffffffffffffffffffffff8b168352602060a08185015281614e1a8b84615071565b90508b9250835b8b811015614e4c57828401614e3f83614e3a83886145d4565b614c87565b9094509150600101614e21565b5084810360408601528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff891115614e84578384fd5b8189029250828a8383013782810192505080820183815281858403016060860152614eaf8189614ca5565b925050508281036080840152614ec6818587614cdf565b9b9a5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a06080830152614f1b60a083018486614cdf565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015615007578151151584529284019290840190600101614fe9565b5050508381038285015280855161501e8184615071565b91508192508381028201848801865b83811015615057578583038552615045838351614d27565b9487019492509086019060010161502d565b50909998505050505050505050565b901515815260200190565b90815260200190565b958652602086019490945273ffffffffffffffffffffffffffffffffffffffff9283166040860152911660608401521515608083015260a082015260c00190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526117cc602083018486614cdf565b600060208252613d3d6020830184614d27565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b60208082526017908201527f42656e746f426f783a20536b696d20746f6f206d756368000000000000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526016908201527f42656e746f426f783a2063616e6e6f7420656d70747900000000000000000000604082015260600190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b60208082526013908201527f42656e746f426f783a204e6f20746f6b656e7300000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526017908201527f42656e746f426f783a20746f5b305d206e6f7420736574000000000000000000604082015260600190565b60208082526014908201527f42656e746f426f783a20746f206e6f7420736574000000000000000000000000604082015260600190565b6020808252601a908201527f53747261746567794d616e616765723a20546f6f206561726c79000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f42656e746f426f783a205472616e73666572206e6f7420617070726f76656400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601b908201527f42656e746f426f783a206e6f206d6173746572436f6e74726163740000000000604082015260600190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b60208082526016908201527f42656e746f426f783a2057726f6e6720616d6f756e7400000000000000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b6020808252601d908201527f42656e746f426f783a20455448207472616e73666572206661696c6564000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f53747261746567794d616e616765723a2054617267657420746f6f2068696768604082015260600190565b6fffffffffffffffffffffffffffffffff91909116815260200190565b6fffffffffffffffffffffffffffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b918252602082015260400190565b67ffffffffffffffff91909116815260200190565b67ffffffffffffffff93841681529190921660208201526fffffffffffffffffffffffffffffffff909116604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615867578283fd5b83018035915067ffffffffffffffff821115615881578283fd5b60200191503681900382131561458d57600080fd5b60005b838110156158b1578181015183820152602001615899565b838111156158c0576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146158e857600080fd5b50565b80151581146158e857600080fdfea2646970667358221220c1735d279c8bc8f393c35e3cf33b5a234c4c73a8b1b30818c98831e89274909f64736f6c634300060c0033",
              "opcodes": "PUSH1 0xE0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x5AD8 CODESIZE SUB DUP1 PUSH3 0x5AD8 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 CHAINID PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH3 0x84 DUP2 PUSH3 0x9E JUMP JUMPDEST PUSH1 0x80 MSTORE POP PUSH1 0x60 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND PUSH1 0xC0 MSTORE PUSH3 0x16A JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH3 0xF9 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x146 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x128 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13F JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH1 0x60 SHR PUSH2 0x592F PUSH3 0x1A9 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x761 MSTORE DUP1 PUSH2 0xB37 MSTORE DUP1 PUSH2 0x2910 MSTORE DUP1 PUSH2 0x2BD6 MSTORE POP DUP1 PUSH2 0x1484 MSTORE POP DUP1 PUSH2 0x14B9 MSTORE POP PUSH2 0x592F PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xD2423B51 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF1676D37 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xF1676D37 EQ PUSH2 0x555 JUMPI DUP1 PUSH4 0xF18D03CC EQ PUSH2 0x575 JUMPI DUP1 PUSH4 0xF483B3DA EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0xF7888AEC EQ PUSH2 0x5B5 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x4D0 JUMPI DUP1 PUSH4 0xDA5139CA EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xDF23B45B EQ PUSH2 0x511 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x540 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x97DA6D30 GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0x97DA6D30 EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x47B JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x490 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x4B0 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x426 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x43B JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x56623118 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x56623118 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x66C6BB0B EQ PUSH2 0x386 JUMPI DUP1 PUSH4 0x72CB5D97 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x3C6 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E EQ PUSH2 0x2E3 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x303 JUMPI DUP1 PUSH4 0x4FFE34DB EQ PUSH2 0x318 JUMPI DUP1 PUSH4 0x5108A558 EQ PUSH2 0x346 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x12A90C8A GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0x254 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0x228BFD9F EQ PUSH2 0x2A1 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x2C1 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x2B9446C EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x212 JUMPI DUP1 PUSH4 0xFCA8843 EQ PUSH2 0x234 JUMPI PUSH2 0x1E3 JUMP JUMPDEST CALLDATASIZE PUSH2 0x1E3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FB PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4929 JUMP JUMPDEST PUSH2 0x5D5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x22D CALLDATASIZE PUSH1 0x4 PUSH2 0x46DD JUMP JUMPDEST PUSH2 0xC8C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x24F CALLDATASIZE PUSH1 0x4 PUSH2 0x4A04 JUMP JUMPDEST PUSH2 0xE17 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x26F CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x11D9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x5066 JUMP JUMPDEST PUSH2 0x294 PUSH2 0x28F CALLDATASIZE PUSH1 0x4 PUSH2 0x4727 JUMP JUMPDEST PUSH2 0x11EE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x4DC7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2BC CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x1457 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x147F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x2FE CALLDATASIZE PUSH1 0x4 PUSH2 0x4B0C JUMP JUMPDEST PUSH2 0x14DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x1613 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x338 PUSH2 0x333 CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x16F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x57B7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x361 CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x1735 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x381 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AD6 JUMP JUMPDEST PUSH2 0x175D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A96 JUMP JUMPDEST PUSH2 0x17D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x48C7 JUMP JUMPDEST PUSH2 0x1F89 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x46B0 JUMP JUMPDEST PUSH2 0x2588 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x4983 JUMP JUMPDEST PUSH2 0x26A5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x421 CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x273F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x432 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2751 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x456 CALLDATASIZE PUSH1 0x4 PUSH2 0x460C JUMP JUMPDEST PUSH2 0x276D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FB PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x4929 JUMP JUMPDEST PUSH2 0x278D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x2D7D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x4AB CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x2DDC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x4CB CALLDATASIZE PUSH1 0x4 PUSH2 0x4644 JUMP JUMPDEST PUSH2 0x2E04 JUMP JUMPDEST PUSH2 0x4E3 PUSH2 0x4DE CALLDATASIZE PUSH1 0x4 PUSH2 0x478D JUMP JUMPDEST PUSH2 0x325D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x4FCC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x50C CALLDATASIZE PUSH1 0x4 PUSH2 0x4AD6 JUMP JUMPDEST PUSH2 0x3409 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x531 PUSH2 0x52C CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x3478 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x57FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x34CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x561 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x570 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B45 JUMP JUMPDEST PUSH2 0x34E9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x590 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D9 JUMP JUMPDEST PUSH2 0x36C4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x5B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x47F3 JUMP JUMPDEST PUSH2 0x391E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x5D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x48C7 JUMP JUMPDEST PUSH2 0x3C69 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x615 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x6EE JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x680 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x6EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0x73B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x538E JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ISZERO PUSH2 0x75F JUMPI DUP9 PUSH2 0x781 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x78B PUSH2 0x4514 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP3 DIV AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ISZERO ISZERO DUP1 PUSH2 0x87C JUMPI POP PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x842 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x856 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x87A SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST GT JUMPDEST PUSH2 0x8B2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x52B2 JUMP JUMPDEST DUP6 PUSH2 0x91C JUMPI PUSH2 0x8C3 DUP2 DUP9 PUSH1 0x0 PUSH2 0x3C86 JUMP JUMPDEST SWAP6 POP PUSH2 0x3E8 PUSH2 0x8F1 PUSH2 0x8D4 DUP9 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x917 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP PUSH2 0xC81 JUMP JUMPDEST PUSH2 0x92B JUMP JUMPDEST PUSH2 0x928 DUP2 DUP8 PUSH1 0x1 PUSH2 0x3DEC JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ADDRESS EQ ISZERO DUP1 PUSH2 0x964 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND ISZERO JUMPDEST DUP1 PUSH2 0x995 JUMPI POP DUP1 MLOAD PUSH2 0x991 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x98B DUP5 PUSH2 0x3E8F JUMP JUMPDEST SWAP1 PUSH2 0x3F73 JUMP JUMPDEST DUP8 GT ISZERO JUMPDEST PUSH2 0x9CB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5168 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0xA08 SWAP1 DUP8 PUSH2 0x3FB0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0xA64 PUSH2 0xA47 DUP8 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xAA1 PUSH2 0xA87 DUP9 PUSH2 0x3D44 JUMP JUMPDEST DUP3 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD DUP6 AND PUSH17 0x100000000000000000000000000000000 MUL SWAP1 DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE DUP11 AND PUSH2 0xBBB JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0xBFA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ADDRESS EQ PUSH2 0xBFA JUMPI PUSH2 0xBFA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP11 ADDRESS DUP11 PUSH2 0x3FED JUMP JUMPDEST DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB2346165E782564F17F5B7E555C21F4FD96FBC93458572BF0113EA35A958FC55 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xC70 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP7 SWAP5 POP DUP6 SWAP4 POP POP POP JUMPDEST POP SWAP6 POP SWAP6 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xCDD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST DUP2 ISZERO PUSH2 0xDD1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xD04 JUMPI POP DUP1 JUMPDEST PUSH2 0xD3A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x527B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0xE12 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0xE54 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0xF24 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0xEB6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xF22 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP3 DUP2 PUSH2 0xF30 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xF45 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xF93 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5357 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1157 JUMPI PUSH1 0x0 DUP9 DUP9 DUP4 DUP2 DUP2 LT PUSH2 0xFAE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xFC3 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST SWAP1 POP PUSH2 0x1066 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0xFD4 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x6 PUSH1 0x0 DUP15 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x3FB0 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP14 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x10BE DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x10A8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP6 PUSH2 0x3FB0 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP4 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0x1132 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD PUSH2 0x1146 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0xF98 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x1195 SWAP1 DUP4 PUSH2 0x3F73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP10 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP12 SWAP1 SWAP13 AND DUP3 MSTORE SWAP10 SWAP1 SWAP10 MSTORE SWAP9 SWAP1 SWAP8 KECCAK256 SWAP8 SWAP1 SWAP8 SSTORE POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x123D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5542 JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x12C6 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x125A SWAP3 SWAP2 SWAP1 PUSH2 0x4D71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x1322 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x4DDF47D400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x13B5 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x510A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x13CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1446 SWAP3 SWAP2 SWAP1 PUSH2 0x510A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x14B7 JUMPI PUSH2 0x14B2 DUP2 PUSH2 0x4158 JUMP JUMPDEST PUSH2 0x14D9 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1530 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST PUSH1 0x5F DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT ISZERO PUSH2 0x1575 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x572D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND PUSH9 0x10000000000000000 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 AND MUL OR SWAP1 SSTORE MLOAD PUSH32 0x7543AF99B5602C06E62DA0631B5308489A5FF859150105A623B6EB15E8DEAE0B SWAP1 PUSH2 0x1607 SWAP1 DUP5 SWAP1 PUSH2 0x57E8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x1665 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5468 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP2 PUSH17 0x100000000000000000000000000000000 SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x17CC SWAP1 DUP5 DUP5 PUSH2 0x3DEC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x17DC PUSH2 0x452B JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH9 0x10000000000000000 DUP3 DIV AND DUP3 DUP6 ADD MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 DUP4 ADD SWAP1 DUP2 MSTORE SWAP5 DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 MLOAD SWAP1 MLOAD PUSH32 0x18FCCC7600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 DUP4 SWAP2 PUSH4 0x18FCCC76 SWAP2 PUSH2 0x18AB SWAP2 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x577F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x18D9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18FD SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x190B JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x1918 JUMPI POP POP POP PUSH2 0xE12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP3 SGT ISZERO PUSH2 0x1A12 JUMPI DUP2 PUSH2 0x1963 DUP3 DUP3 PUSH2 0x3FB0 JUMP JUMPDEST SWAP2 POP PUSH2 0x196E DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 SWAP1 PUSH2 0x1A04 SWAP1 DUP5 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x1B2D JUMP JUMPDEST PUSH1 0x0 DUP3 SLT ISZERO PUSH2 0x1B2D JUMPI PUSH1 0x0 DUP3 SWAP1 SUB PUSH2 0x1A2A DUP3 DUP3 PUSH2 0x3F73 JUMP JUMPDEST SWAP2 POP PUSH2 0x1A35 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1AC2 PUSH2 0x1AA5 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 SWAP1 PUSH2 0x1B23 SWAP1 DUP5 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP6 ISZERO PUSH2 0x1EB1 JUMPI PUSH1 0x0 PUSH1 0x64 PUSH2 0x1B58 DUP7 PUSH1 0x20 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x1B5F JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x1CFE JUMPI PUSH1 0x0 PUSH2 0x1BAB DUP7 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH2 0x3F73 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1BBB JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x1BC3 JUMPI POP DUP6 JUMPDEST PUSH2 0x1BE4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND DUP7 DUP4 PUSH2 0x4272 JUMP JUMPDEST PUSH2 0x1C0D PUSH2 0x1BF0 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH32 0x6939AAF500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x6939AAF5 SWAP1 PUSH2 0x1C78 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1CA6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB18E7E4F6EAC147A63A3BB6BEB2D9039C88698623AFF3EFC4FEBBC20B0164EE5 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1CF0 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x1EAF JUMP JUMPDEST DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT ISZERO PUSH2 0x1EAF JUMPI PUSH1 0x0 PUSH2 0x1D47 PUSH2 0x1D2A DUP4 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1D69 JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x1D71 JUMPI POP DUP6 JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1DC6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1DF4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1E18 SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E43 PUSH2 0x1E26 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP10 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A SWAP1 PUSH2 0x1EA4 SWAP1 DUP5 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMPDEST POP JUMPDEST POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD SWAP4 SWAP1 SWAP5 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH17 0x100000000000000000000000000000000 MUL PUSH8 0xFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH9 0x10000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP4 SWAP1 SWAP4 OR SWAP2 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1FDA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST PUSH2 0x1FE2 PUSH2 0x452B JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH9 0x10000000000000000 DUP3 DIV DUP2 AND DUP4 DUP7 ADD MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 DUP5 ADD MSTORE SWAP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP2 MLOAD SWAP2 SWAP4 AND SWAP2 AND ISZERO DUP1 PUSH2 0x20AC JUMPI POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x2164 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP2 DUP6 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x210D TIMESTAMP PUSH2 0x43DA JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP2 SWAP1 DUP7 AND SWAP1 PUSH32 0x6F7CCDF3F86039E5A1DCF6028BF7B4773CBF7A234716BA2E5392B12BB0F8558F SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH2 0x24B4 JUMP JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2189 JUMPI POP DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND TIMESTAMP LT ISZERO JUMPDEST PUSH2 0x21BF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53C5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2418 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD DUP6 DUP3 ADD MLOAD SWAP2 MLOAD PUSH32 0x7F8661A100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP3 SWAP4 AND SWAP2 PUSH4 0x7F8661A1 SWAP2 PUSH2 0x2253 SWAP2 PUSH1 0x4 ADD PUSH2 0x5762 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x226D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2281 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x22A5 SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 SGT ISZERO PUSH2 0x2336 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP2 SWAP1 PUSH2 0x22E1 SWAP1 DUP3 PUSH2 0x441E JUMP JUMPDEST POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2328 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x23C4 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT ISZERO PUSH2 0x23C4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 DUP3 SWAP1 SUB SWAP1 PUSH2 0x2373 SWAP1 DUP3 PUSH2 0x448C JUMP JUMPDEST POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 DUP3 PUSH1 0x40 MLOAD PUSH2 0x23BA SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A DUP5 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x240E SWAP2 SWAP1 PUSH2 0x5762 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 DUP9 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE DUP4 DUP9 MSTORE DUP8 DUP3 ADD DUP5 SWAP1 MSTORE DUP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD SWAP1 SWAP3 AND SWAP1 SWAP2 SSTORE MLOAD SWAP3 DUP7 AND SWAP3 PUSH32 0x3E6352A885ADC4CC54767592939C3B1BBD65685658C3BEAABA66A888120E217 SWAP2 SWAP1 LOG3 JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD SWAP4 SWAP1 SWAP6 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP3 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP6 DUP7 AND OR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND PUSH9 0x10000000000000000 SWAP6 SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 MUL SWAP2 SWAP1 SWAP2 OR PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH17 0x100000000000000000000000000000000 SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x25D9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x2626 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x519F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x1607 SWAP1 DUP5 SWAP1 PUSH2 0x5066 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD505ACCF00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0x2703 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x4F58 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x271D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2731 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x27CD JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x289D JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x282F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x289B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0x28EA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x538E JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ISZERO PUSH2 0x290E JUMPI DUP9 PUSH2 0x2930 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x293A PUSH2 0x4514 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP5 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV AND SWAP1 DUP3 ADD MSTORE DUP6 PUSH2 0x29B5 JUMPI PUSH2 0x29AE DUP2 DUP9 PUSH1 0x1 PUSH2 0x3C86 JUMP JUMPDEST SWAP6 POP PUSH2 0x29C4 JUMP JUMPDEST PUSH2 0x29C1 DUP2 DUP8 PUSH1 0x0 PUSH2 0x3DEC JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x2A01 SWAP1 DUP8 PUSH2 0x3F73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP15 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x2A5A PUSH2 0x2A40 DUP9 PUSH2 0x3D44 JUMP JUMPDEST DUP3 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH2 0x2A97 PUSH2 0x2A7A DUP8 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO DUP1 PUSH2 0x2AD4 JUMPI POP PUSH1 0x20 DUP2 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO JUMPDEST PUSH2 0x2B0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5244 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND OR DUP2 AND PUSH17 0x100000000000000000000000000000000 SWAP2 SWAP1 SWAP4 AND MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP11 AND PUSH2 0x2CE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x2C0B SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH1 0x40 MLOAD PUSH2 0x2C63 SWAP1 PUSH2 0x4DC4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2CA0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2CA5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2CE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x56BF JUMP JUMPDEST POP PUSH2 0x2D07 JUMP JUMPDEST PUSH2 0x2D07 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP10 DUP10 PUSH2 0x4272 JUMP JUMPDEST DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xAD9AB9EE6953D4D177F4A03B3A3AC3178FFCB9816319F348060194AA76B14486 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xC70 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x2E51 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5577 JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0x2E5D JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x2E6A JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0x2F81 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x2EBE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x51D6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2F1D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x54D4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x2F7C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5688 JUMP JUMPDEST PUSH2 0x31BE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0x2FCE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x561A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x300E PUSH2 0x147F JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0x305A JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0x307C JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0x30C3 SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0x507A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x30EB SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4D9D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x3128 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x50EC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x314A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x31BB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x550B JUMP JUMPDEST POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0x324D SWAP1 DUP9 SWAP1 PUSH2 0x5066 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x3277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x32A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x32BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x32EF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x32DA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x3400 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x330E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x3320 SWAP2 SWAP1 PUSH2 0x5833 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x332E SWAP3 SWAP2 SWAP1 PUSH2 0x4D71 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3369 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x336E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x337D JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x3386 DUP3 PUSH2 0x44B4 JUMP JUMPDEST SWAP1 PUSH2 0x33BE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP2 SWAP1 PUSH2 0x511E JUMP JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x33CC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x33EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x32F5 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x17CC SWAP1 DUP5 DUP5 PUSH2 0x3C86 JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP2 PUSH9 0x10000000000000000 DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x34FA DUP6 PUSH1 0x32 PUSH2 0x4221 JUMP JUMPDEST DUP2 PUSH2 0x3501 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x3525 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 DUP7 PUSH2 0x4272 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23E30C8B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND SWAP1 PUSH4 0x23E30C8B SWAP1 PUSH2 0x3581 SWAP1 CALLER SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x4ED5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x359B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x35AF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x35FC PUSH2 0x35BF DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x441E JUMP JUMPDEST PUSH2 0x3605 DUP7 PUSH2 0x3E8F JUMP JUMPDEST LT ISZERO PUSH2 0x363D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5651 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP8 DUP6 PUSH1 0x40 MLOAD PUSH2 0x36B3 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x3701 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x37D1 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x3763 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x37CF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x381E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x538E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x385B SWAP1 DUP4 PUSH2 0x3F73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x38A4 SWAP1 DUP4 PUSH2 0x3FB0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP7 AND DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE MLOAD SWAP2 DUP8 AND SWAP2 PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A SWAP1 PUSH2 0x390F SWAP1 DUP8 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x3937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x3961 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3A3D JUMPI PUSH1 0x0 DUP8 DUP8 DUP4 DUP2 DUP2 LT PUSH2 0x397E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH3 0x186A0 PUSH2 0x399F PUSH1 0x32 DUP4 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x39A6 JUMPI INVALID JUMPDEST DIV DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x39B3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x3A34 DUP13 DUP13 DUP5 DUP2 DUP2 LT PUSH2 0x39CE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x39E3 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST DUP10 DUP10 DUP6 DUP2 DUP2 LT PUSH2 0x39EF JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP13 DUP13 DUP7 DUP2 DUP2 LT PUSH2 0x3A02 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3A17 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 SWAP1 PUSH2 0x4272 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3968 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0xD9D1762300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP1 PUSH4 0xD9D17623 SWAP1 PUSH2 0x3A9E SWAP1 CALLER SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP11 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4DE8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3AB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3ACC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2731 JUMPI PUSH1 0x0 DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x3AE9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3AFE SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST SWAP1 POP PUSH2 0x3B5C PUSH2 0x3B1F DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x3B12 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x441E JUMP JUMPDEST PUSH2 0x3B65 DUP3 PUSH2 0x3E8F JUMP JUMPDEST LT ISZERO PUSH2 0x3B9D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5651 JUMP JUMPDEST DUP12 DUP12 DUP4 DUP2 DUP2 LT PUSH2 0x3BA9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3BBE SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP15 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP12 DUP12 DUP8 DUP2 DUP2 LT PUSH2 0x3C2F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x3C42 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x3C58 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0x3AD3 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3CA8 JUMPI POP DUP2 PUSH2 0x3D3D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH2 0x3CD0 SWAP2 DUP7 SWAP2 AND PUSH2 0x4221 JUMP JUMPDEST DUP2 PUSH2 0x3CD7 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x3D2D JUMPI POP DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3D23 DUP7 PUSH1 0x0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x3D2A JUMPI INVALID JUMPDEST DIV LT JUMPDEST ISZERO PUSH2 0x3D3D JUMPI PUSH2 0x17CC DUP2 PUSH1 0x1 PUSH2 0x3FB0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3D90 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x52E9 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 EQ ISZERO PUSH2 0x3E14 JUMPI POP DUP2 PUSH2 0x3D3D JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH2 0x3E3C SWAP2 DUP7 SWAP2 AND PUSH2 0x4221 JUMP JUMPDEST DUP2 PUSH2 0x3E43 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x3D2D JUMPI POP DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3D23 DUP7 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 PUSH2 0x3DE6 SWAP3 PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP3 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH4 0x70A08231 SWAP1 PUSH2 0x3F1D SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x4DC7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3F35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3F49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3F6D SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 PUSH2 0x3FB0 JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5131 JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5320 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x4025 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4F27 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x40AE SWAP2 SWAP1 PUSH2 0x4D81 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40EB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40F0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x411A JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x411A JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x411A SWAP2 SWAP1 PUSH2 0x47D7 JUMP JUMPDEST PUSH2 0x4150 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55E5 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x41B1 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x50BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 DUP3 SUB PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND SWAP1 DUP3 AND GT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5131 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x423C JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x4239 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x56F6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x42A8 SWAP3 SWAP2 SWAP1 PUSH2 0x4FA6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x4331 SWAP2 SWAP1 PUSH2 0x4D81 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x436E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4373 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x439D JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x439D JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x439D SWAP2 SWAP1 PUSH2 0x47D7 JUMP JUMPDEST PUSH2 0x43D3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x520D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3D90 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x549D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4446 PUSH2 0x442C DUP4 PUSH2 0x3D44 JUMP JUMPDEST DUP5 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST DUP4 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 DUP2 OR SWAP1 SWAP4 SSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4446 PUSH2 0x449A DUP4 PUSH2 0x3D44 JUMP JUMPDEST DUP5 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x44FA JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x41CA JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3DE6 SWAP2 SWAP1 PUSH2 0x4BCE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x455C JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4573 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x458D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x45A5 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x45BC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x458D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x3DE6 DUP2 PUSH2 0x58C6 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x3DE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4601 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D3D DUP2 PUSH2 0x58C6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x461E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4629 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4639 DUP2 PUSH2 0x58C6 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x465C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4667 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4677 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x4687 DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP4 POP PUSH2 0x4696 DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x45DF JUMP JUMPDEST SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x46C2 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x46CD DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4639 DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x46F1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x46FC DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x470C DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x471C DUP2 PUSH2 0x58EB JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x473C JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4747 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4762 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x476E DUP8 DUP3 DUP9 ADD PUSH2 0x4594 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x4782 DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x47A1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x47B7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x47C3 DUP7 DUP3 DUP8 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x471C DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47E8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3D3D DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP11 DUP13 SUB SLT ISZERO PUSH2 0x4810 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP10 CALLDATALOAD PUSH2 0x481B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP9 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4837 JUMPI DUP9 DUP10 REVERT JUMPDEST PUSH2 0x4843 DUP14 DUP4 DUP15 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH1 0x40 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x485B JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4867 DUP14 DUP4 DUP15 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x487F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x488B DUP14 DUP4 DUP15 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x48A3 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x48B0 DUP13 DUP3 DUP14 ADD PUSH2 0x4594 JUMP JUMPDEST SWAP2 POP DUP1 SWAP4 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x461E JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x48EE JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x48F9 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x4909 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x4919 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x4940 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x494B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x495B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x496B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x499F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x49AA DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x49BA DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x49CA DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH2 0x49E7 DUP11 PUSH1 0xA0 DUP12 ADD PUSH2 0x45DF JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD SWAP2 POP PUSH1 0xE0 DUP10 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 SWAP1 SWAP4 SWAP7 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4A1C JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4A27 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4A37 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4A53 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x4A5F DUP11 DUP4 DUP12 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A77 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x4A84 DUP10 DUP3 DUP11 ADD PUSH2 0x454B JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4AAA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4AB5 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4AC5 DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4AEA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4AF5 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x471C DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B1E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4B29 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4639 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4B5D JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4B68 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4B78 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x4B88 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4BAA JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4A84 DUP10 DUP3 DUP11 ADD PUSH2 0x4594 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4BC7 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4BDF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4BF6 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4C09 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x4C17 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x4C55 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x4C6C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4C7D DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5896 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4CD4 JUMPI DUP2 MLOAD DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4CB8 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x4D3F DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5896 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4D93 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5896 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD PUSH2 0x4DAF DUP2 DUP5 PUSH1 0x20 DUP10 ADD PUSH2 0x5896 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 MSTORE PUSH1 0x20 PUSH1 0xA0 DUP2 DUP6 ADD MSTORE DUP2 PUSH2 0x4E1A DUP12 DUP5 PUSH2 0x5071 JUMP JUMPDEST SWAP1 POP DUP12 SWAP3 POP DUP4 JUMPDEST DUP12 DUP2 LT ISZERO PUSH2 0x4E4C JUMPI DUP3 DUP5 ADD PUSH2 0x4E3F DUP4 PUSH2 0x4E3A DUP4 DUP9 PUSH2 0x45D4 JUMP JUMPDEST PUSH2 0x4C87 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP2 POP PUSH1 0x1 ADD PUSH2 0x4E21 JUMP JUMPDEST POP DUP5 DUP2 SUB PUSH1 0x40 DUP7 ADD MSTORE DUP9 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 GT ISZERO PUSH2 0x4E84 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP10 MUL SWAP3 POP DUP3 DUP11 DUP4 DUP4 ADD CALLDATACOPY DUP3 DUP2 ADD SWAP3 POP POP DUP1 DUP3 ADD DUP4 DUP2 MSTORE DUP2 DUP6 DUP5 SUB ADD PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x4EAF DUP2 DUP10 PUSH2 0x4CA5 JUMP JUMPDEST SWAP3 POP POP POP DUP3 DUP2 SUB PUSH1 0x80 DUP5 ADD MSTORE PUSH2 0x4EC6 DUP2 DUP6 DUP8 PUSH2 0x4CDF JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND DUP4 MSTORE DUP1 DUP9 AND PUSH1 0x20 DUP5 ADD MSTORE POP DUP6 PUSH1 0x40 DUP4 ADD MSTORE DUP5 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x4F1B PUSH1 0xA0 DUP4 ADD DUP5 DUP7 PUSH2 0x4CDF JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5007 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4FE9 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x501E DUP2 DUP5 PUSH2 0x5071 JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5057 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x5045 DUP4 DUP4 MLOAD PUSH2 0x4D27 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x502D JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x17CC PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x4CDF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x3D3D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4D27 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20556E646572666C6F770000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20536B696D20746F6F206D756368000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A2063616E6E6F7420656D70747900000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A207A65726F20616464726573730000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A204E6F20746F6B656E7300000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20746F5B305D206E6F7420736574000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20746F206E6F7420736574000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A20546F6F206561726C79000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A205472616E73666572206E6F7420617070726F76656400 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A206E6F206D6173746572436F6E74726163740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E7366657246726F6D206661696C6564 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A2057726F6E6720616D6F756E7400000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20455448207472616E73666572206661696C6564000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A2054617267657420746F6F2068696768 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5867 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5881 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x458D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x58B1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5899 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x58C0 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x58E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x58E8 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC1 PUSH20 0x5D279C8BC8F393C35E3CF33B5A234C4C73A8B1B3 ADDMOD XOR 0xC9 DUP9 BALANCE 0xE8 SWAP3 PUSH21 0x909F64736F6C634300060C00330000000000000000 ",
              "sourceMap": "27784:23045:0:-:0;;;30546:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13639:5;:18;;-1:-1:-1;;;;;;13639:18:0;13647:10;13639:18;;;;;13672:44;;13647:10;;13639:5;13672:44;;13639:5;;13672:44;19850:9;19924:35;;;;19898:62;19850:9;19898:25;:62::i;:::-;19878:82;;-1:-1:-1;30594:22:0;;-1:-1:-1;;;;;;30594:22:0;;;27784:23045;;19973:211;20047:7;19146:80;20127:24;20153:7;20170:4;20083:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20073:104;;;;;;20066:111;;19973:211;;;:::o;172:289:-1:-;;300:2;288:9;279:7;275:23;271:32;268:2;;;-1:-1;;306:12;268:2;96:13;;-1:-1;;;;;1741:54;;1958:48;;1948:2;;-1:-1;;2010:12;1948:2;358:87;262:199;-1:-1;;;262:199::o;828:556::-;659:37;;;1204:2;1189:18;;659:37;;;;1287:2;1272:18;;659:37;-1:-1;;;;;1741:54;1370:2;1355:18;;539:37;1039:3;1024:19;;1010:374::o;:::-;27784:23045:0;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "1170": [
                  {
                    "length": 32,
                    "start": 5305
                  }
                ],
                "1172": [
                  {
                    "length": 32,
                    "start": 5252
                  }
                ],
                "1680": [
                  {
                    "length": 32,
                    "start": 1889
                  },
                  {
                    "length": 32,
                    "start": 2871
                  },
                  {
                    "length": 32,
                    "start": 10512
                  },
                  {
                    "length": 32,
                    "start": 11222
                  }
                ]
              },
              "linkReferences": {},
              "object": "6080604052600436106101dc5760003560e01c80637c516e9411610102578063d2423b5111610095578063f1676d3711610064578063f1676d3714610555578063f18d03cc14610575578063f483b3da14610595578063f7888aec146105b5576101e3565b8063d2423b51146104d0578063da5139ca146104f1578063df23b45b14610511578063e30c397814610540576101e3565b806397da6d30116100d157806397da6d301461045b578063aee4d1b21461047b578063bafe4f1414610490578063c0a47c93146104b0576101e3565b80637c516e94146103e65780637ecebe00146104065780638da5cb5b1461042657806391e0eab51461043b576101e3565b80633e2a9d4e1161017a5780635662311811610149578063566231181461036657806366c6bb0b1461038657806372cb5d97146103a6578063733a9d7c146103c6576101e3565b80633e2a9d4e146102e35780634e71e0c8146103035780634ffe34db146103185780635108a55814610346576101e3565b806312a90c8a116101b657806312a90c8a146102545780631f54245b14610281578063228bfd9f146102a15780633644e515146102c1576101e3565b806302b9446c146101e8578063078dfbe7146102125780630fca884314610234576101e3565b366101e357005b600080fd5b6101fb6101f6366004614929565b6105d5565b6040516102099291906157da565b60405180910390f35b34801561021e57600080fd5b5061023261022d3660046146dd565b610c8c565b005b34801561024057600080fd5b5061023261024f366004614a04565b610e17565b34801561026057600080fd5b5061027461026f3660046145f0565b6111d9565b6040516102099190615066565b61029461028f366004614727565b6111ee565b6040516102099190614dc7565b3480156102ad57600080fd5b506102946102bc3660046145f0565b611457565b3480156102cd57600080fd5b506102d661147f565b6040516102099190615071565b3480156102ef57600080fd5b506102326102fe366004614b0c565b6114df565b34801561030f57600080fd5b50610232611613565b34801561032457600080fd5b506103386103333660046145f0565b6116f9565b6040516102099291906157b7565b34801561035257600080fd5b506102946103613660046145f0565b611735565b34801561037257600080fd5b506102d6610381366004614ad6565b61175d565b34801561039257600080fd5b506102326103a1366004614a96565b6117d4565b3480156103b257600080fd5b506102326103c13660046148c7565b611f89565b3480156103d257600080fd5b506102326103e13660046146b0565b612588565b3480156103f257600080fd5b50610232610401366004614983565b6126a5565b34801561041257600080fd5b506102d66104213660046145f0565b61273f565b34801561043257600080fd5b50610294612751565b34801561044757600080fd5b5061027461045636600461460c565b61276d565b34801561046757600080fd5b506101fb610476366004614929565b61278d565b34801561048757600080fd5b50610232612d7d565b34801561049c57600080fd5b506102946104ab3660046145f0565b612ddc565b3480156104bc57600080fd5b506102326104cb366004614644565b612e04565b6104e36104de36600461478d565b61325d565b604051610209929190614fcc565b3480156104fd57600080fd5b506102d661050c366004614ad6565b613409565b34801561051d57600080fd5b5061053161052c3660046145f0565b613478565b604051610209939291906157fd565b34801561054c57600080fd5b506102946134cd565b34801561056157600080fd5b50610232610570366004614b45565b6134e9565b34801561058157600080fd5b506102326105903660046148d9565b6136c4565b3480156105a157600080fd5b506102326105b03660046147f3565b61391e565b3480156105c157600080fd5b506102d66105d03660046148c7565b613c69565b6000808573ffffffffffffffffffffffffffffffffffffffff81163314801590610615575073ffffffffffffffffffffffffffffffffffffffff81163014155b156106ee573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610680576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff166106ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b73ffffffffffffffffffffffffffffffffffffffff861661073b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061538e565b600073ffffffffffffffffffffffffffffffffffffffff89161561075f5788610781565b7f00000000000000000000000000000000000000000000000000000000000000005b905061078b614514565b5073ffffffffffffffffffffffffffffffffffffffff81166000908152600760209081526040918290208251808401909352546fffffffffffffffffffffffffffffffff808216808552700100000000000000000000000000000000909204169183019190915215158061087c575060008273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561084257600080fd5b505afa158015610856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087a9190614bb6565b115b6108b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906152b2565b8561091c576108c381886000613c86565b95506103e86108f16108d488613d44565b60208401516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff16101561091757600080945094505050610c81565b61092b565b61092881876001613dec565b96505b73ffffffffffffffffffffffffffffffffffffffff891630141580610964575073ffffffffffffffffffffffffffffffffffffffff8a16155b8061099557508051610991906fffffffffffffffffffffffffffffffff1661098b84613e8f565b90613f73565b8711155b6109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615168565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660209081526040808320938c1683529290522054610a089087613fb0565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660209081526040808320938d1683529290522055610a64610a4787613d44565b60208301516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff166020820152610aa1610a8788613d44565b82516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff908116825273ffffffffffffffffffffffffffffffffffffffff808416600090815260076020908152604090912084518154928601518516700100000000000000000000000000000000029085167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217909316179091558a16610bbb577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b9d57600080fd5b505af1158015610bb1573d6000803e3d6000fd5b5050505050610bfa565b73ffffffffffffffffffffffffffffffffffffffff89163014610bfa57610bfa73ffffffffffffffffffffffffffffffffffffffff83168a308a613fed565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb2346165e782564f17f5b7e555c21f4fd96fbc93458572bf0113ea35a958fc558a8a604051610c709291906157da565b60405180910390a486945085935050505b509550959350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b8115610dd15773ffffffffffffffffffffffffffffffffffffffff8316151580610d045750805b610d3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061527b565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600180549091169055610e12565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b8473ffffffffffffffffffffffffffffffffffffffff81163314801590610e54575073ffffffffffffffffffffffffffffffffffffffff81163014155b15610f24573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff16610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b600085858281610f3057fe5b9050602002016020810190610f4591906145f0565b73ffffffffffffffffffffffffffffffffffffffff161415610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615357565b600084815b81811015611157576000888883818110610fae57fe5b9050602002016020810190610fc391906145f0565b9050611066878784818110610fd457fe5b90506020020135600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613fb090919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff808d166000908152600660209081526040808320938616835292905220556110be8787848181106110a857fe5b9050602002013585613fb090919063ffffffff16565b93508073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a8a8a8781811061113257fe5b905060200201356040516111469190615071565b60405180910390a450600101610f98565b5073ffffffffffffffffffffffffffffffffffffffff808a166000908152600660209081526040808320938c16835292905220546111959083613f73565b73ffffffffffffffffffffffffffffffffffffffff998a1660009081526006602090815260408083209b909c16825299909952989097209790975550505050505050565b60046020526000908152604090205460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff851661123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615542565b606085901b82156112c6576000858560405161125a929190614d71565b604051809103902090506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152816037826000f593505050611322565b6040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09250505b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600260205260409081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938a169390931790925590517f4ddf47d4000000000000000000000000000000000000000000000000000000008152634ddf47d49034906113b5908990899060040161510a565b6000604051808303818588803b1580156113ce57600080fd5b505af11580156113e2573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b878760405161144692919061510a565b60405180910390a350949350505050565b60086020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6000467f000000000000000000000000000000000000000000000000000000000000000081146114b7576114b281614158565b6114d9565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314611530576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b605f8167ffffffffffffffff161115611575576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061572d565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600a60205260409081902080547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff861602179055517f7543af99b5602c06e62da0631b5308489a5ff859150105a623b6eb15e8deae0b906116079084906157e8565b60405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff16338114611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615468565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b6007602052600090815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b60096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416918101919091526117cc908484613dec565b949350505050565b6117dc61452b565b5073ffffffffffffffffffffffffffffffffffffffff8381166000818152600a602090815260408083208151606081018352905467ffffffffffffffff8082168352680100000000000000008204168285015270010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16818301908152948452600890925280832054935190517f18fccc760000000000000000000000000000000000000000000000000000000081529194939093169283916318fccc76916118ab91339060040161577f565b602060405180830381600087803b1580156118c557600080fd5b505af11580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd9190614bb6565b90508015801561190b575084155b1561191857505050610e12565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600760205260408120546fffffffffffffffffffffffffffffffff1690821315611a1257816119638282613fb0565b915061196e82613d44565b73ffffffffffffffffffffffffffffffffffffffff89166000818152600760205260409081902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff949094169390931790925590517f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d290611a04908490615071565b60405180910390a250611b2d565b6000821215611b2d576000829003611a2a8282613f73565b9150611a3582613d44565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260076020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216919091179055611ac2611aa582613d44565b60408701516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff166040808701919091525173ffffffffffffffffffffffffffffffffffffffff8916907f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf9790611b23908490615071565b60405180910390a2505b8515611eb15760006064611b58866020015167ffffffffffffffff168461422190919063ffffffff16565b81611b5f57fe5b0490508085604001516fffffffffffffffffffffffffffffffff161015611cfe576000611bab86604001516fffffffffffffffffffffffffffffffff1683613f7390919063ffffffff16565b90508615801590611bbb57508681115b15611bc35750855b611be473ffffffffffffffffffffffffffffffffffffffff8a168683614272565b611c0d611bf082613d44565b60408801516fffffffffffffffffffffffffffffffff1690613d94565b6fffffffffffffffffffffffffffffffff16604080880191909152517f6939aaf500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690636939aaf590611c78908490600401615071565b600060405180830381600087803b158015611c9257600080fd5b505af1158015611ca6573d6000803e3d6000fd5b505050508873ffffffffffffffffffffffffffffffffffffffff167fb18e7e4f6eac147a63a3bb6beb2d9039c88698623aff3efc4febbc20b0164ee582604051611cf09190615071565b60405180910390a250611eaf565b8085604001516fffffffffffffffffffffffffffffffff161115611eaf576000611d47611d2a83613d44565b60408801516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff1690508615801590611d6957508681115b15611d715750855b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff871690632e1a7d4d90611dc6908590600401615071565b602060405180830381600087803b158015611de057600080fd5b505af1158015611df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e189190614bb6565b9050611e43611e2682613d44565b60408901516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff166040808901919091525173ffffffffffffffffffffffffffffffffffffffff8b16907f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a90611ea4908490615071565b60405180910390a250505b505b50505073ffffffffffffffffffffffffffffffffffffffff84166000908152600a6020908152604091829020835181549285015193909401516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000267ffffffffffffffff94851668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff959096167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941693909317939093169390931791909116179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b611fe261452b565b5073ffffffffffffffffffffffffffffffffffffffff8281166000818152600a602090815260408083208151606081018352905467ffffffffffffffff80821683526801000000000000000082048116838601527001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff16828401529484526009909252909120548151919316911615806120ac57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156121645773ffffffffffffffffffffffffffffffffffffffff848116600090815260096020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691851691909117905561210d426143da565b67ffffffffffffffff16825260405173ffffffffffffffffffffffffffffffffffffffff80851691908616907f6f7ccdf3f86039e5a1dcf6028bf7b4773cbf7a234716ba2e5392b12bb0f8558f90600090a36124b4565b815167ffffffffffffffff16158015906121895750815167ffffffffffffffff164210155b6121bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153c5565b73ffffffffffffffffffffffffffffffffffffffff84811660009081526008602052604090205416156124185773ffffffffffffffffffffffffffffffffffffffff808516600090815260086020526040808220548582015191517f7f8661a100000000000000000000000000000000000000000000000000000000815292931691637f8661a19161225391600401615762565b602060405180830381600087803b15801561226d57600080fd5b505af1158015612281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a59190614bb6565b905060008113156123365773ffffffffffffffffffffffffffffffffffffffff8516600090815260076020526040902081906122e1908261441e565b508573ffffffffffffffffffffffffffffffffffffffff167f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d2826040516123289190615071565b60405180910390a2506123c4565b60008112156123c45773ffffffffffffffffffffffffffffffffffffffff851660009081526007602052604081209082900390612373908261448c565b508573ffffffffffffffffffffffffffffffffffffffff167f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf97826040516123ba9190615071565b60405180910390a2505b8473ffffffffffffffffffffffffffffffffffffffff167f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a846040015160405161240e9190615762565b60405180910390a2505b73ffffffffffffffffffffffffffffffffffffffff808516600081815260086020908152604080832080548688167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091558388528782018490528484526009909252808320805490921690915551928616927f03e6352a885adc4cc54767592939c3b1bbd65685658c3beaaba66a888120e2179190a35b5073ffffffffffffffffffffffffffffffffffffffff929092166000908152600a6020908152604091829020845181549286015193909501517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff958616177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000009590931694909402919091176fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000091909216021790915550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906153fc565b73ffffffffffffffffffffffffffffffffffffffff8216612626576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061519f565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e260090611607908490615066565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063d505accf90612703908a908a908a908a908a908a908a90600401614f58565b600060405180830381600087803b15801561271d57600080fd5b505af1158015612731573d6000803e3d6000fd5b505050505050505050505050565b60056020526000908152604090205481565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600360209081526000928352604080842090915290825290205460ff1681565b6000808573ffffffffffffffffffffffffffffffffffffffff811633148015906127cd575073ffffffffffffffffffffffffffffffffffffffff81163014155b1561289d573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff168061282f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff1661289b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b73ffffffffffffffffffffffffffffffffffffffff86166128ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061538e565b600073ffffffffffffffffffffffffffffffffffffffff89161561290e5788612930565b7f00000000000000000000000000000000000000000000000000000000000000005b905061293a614514565b5073ffffffffffffffffffffffffffffffffffffffff81166000908152600760209081526040918290208251808401909352546fffffffffffffffffffffffffffffffff80821684527001000000000000000000000000000000009091041690820152856129b5576129ae81886001613c86565b95506129c4565b6129c181876000613dec565b96505b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600660209081526040808320938d1683529290522054612a019087613f73565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600660209081526040808320938e1683529290522055612a5a612a4088613d44565b82516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff168152612a97612a7a87613d44565b60208301516fffffffffffffffffffffffffffffffff16906141cf565b6fffffffffffffffffffffffffffffffff16602082018190526103e8111580612ad4575060208101516fffffffffffffffffffffffffffffffff16155b612b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615244565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260076020908152604090912083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911790558a16612ce6576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90612c0b908a90600401615071565b600060405180830381600087803b158015612c2557600080fd5b505af1158015612c39573d6000803e3d6000fd5b5050505060008873ffffffffffffffffffffffffffffffffffffffff1688604051612c6390614dc4565b60006040518083038185875af1925050503d8060008114612ca0576040519150601f19603f3d011682016040523d82523d6000602084013e612ca5565b606091505b5050905080612ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906156bf565b50612d07565b612d0773ffffffffffffffffffffffffffffffffffffffff83168989614272565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fad9ab9ee6953d4d177f4a03b3a3ac3178ffcb9816319f348060194aa76b144868a8a604051610c709291906157da565b3360008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8516612e51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615577565b81158015612e5d575080155b8015612e6a575060ff8316155b15612f815773ffffffffffffffffffffffffffffffffffffffff86163314612ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906151d6565b73ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409020541615612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906154d4565b73ffffffffffffffffffffffffffffffffffffffff851660009081526004602052604090205460ff16612f7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615688565b6131be565b73ffffffffffffffffffffffffffffffffffffffff8616612fce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061561a565b60006040518060400160405280600281526020017f190100000000000000000000000000000000000000000000000000000000000081525061300e61147f565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade28761305a577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b161307c565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526005602090815260409182902080546001810190915591516130c39493928e928e928e92910161507a565b604051602081830303815290604052805190602001206040516020016130eb93929190614d9d565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161312894939291906150ec565b6020604051602081039080840390855afa15801561314a573d6000803e3d6000fd5b5050506020604051035190508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061550b565b50505b73ffffffffffffffffffffffffffffffffffffffff8581166000818152600360209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b0592579061324d908890615066565b60405180910390a3505050505050565b6060808367ffffffffffffffff8111801561327757600080fd5b506040519080825280602002602001820160405280156132a1578160200160208202803683370190505b5091508367ffffffffffffffff811180156132bb57600080fd5b506040519080825280602002602001820160405280156132ef57816020015b60608152602001906001900390816132da5790505b50905060005b8481101561340057600060603088888581811061330e57fe5b90506020028101906133209190615833565b60405161332e929190614d71565b600060405180830381855af49150503d8060008114613369576040519150601f19603f3d011682016040523d82523d6000602084013e61336e565b606091505b5091509150818061337d575085155b613386826144b4565b906133be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677919061511e565b50818584815181106133cc57fe5b602002602001019015159081151581525050808484815181106133eb57fe5b602090810291909101015250506001016132f5565b50935093915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416918101919091526117cc908484613c86565b600a6020526000908152604090205467ffffffffffffffff808216916801000000000000000081049091169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1683565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000620186a06134fa856032614221565b8161350157fe5b04905061352573ffffffffffffffffffffffffffffffffffffffff86168786614272565b6040517f23e30c8b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906323e30c8b906135819033908990899087908a908a90600401614ed5565b600060405180830381600087803b15801561359b57600080fd5b505af11580156135af573d6000803e3d6000fd5b505050506135fc6135bf82613d44565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600760205260409020906fffffffffffffffffffffffffffffffff1661441e565b61360586613e8f565b101561363d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615651565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a22320487856040516136b39291906157da565b60405180910390a450505050505050565b8273ffffffffffffffffffffffffffffffffffffffff81163314801590613701575073ffffffffffffffffffffffffffffffffffffffff81163014155b156137d1573360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680613763576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155ae565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602090815260408083209386168352929052205460ff166137cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615431565b505b73ffffffffffffffffffffffffffffffffffffffff831661381e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061538e565b73ffffffffffffffffffffffffffffffffffffffff80861660009081526006602090815260408083209388168352929052205461385b9083613f73565b73ffffffffffffffffffffffffffffffffffffffff8681166000908152600660209081526040808320898516845290915280822093909355908516815220546138a49083613fb0565b73ffffffffffffffffffffffffffffffffffffffff80871660008181526006602090815260408083208986168085529252918290209490945551918716917f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a9061390f908790615071565b60405180910390a45050505050565b60608567ffffffffffffffff8111801561393757600080fd5b50604051908082528060200260200182016040528015613961578160200160208202803683370190505b5090508560005b81811015613a3d57600087878381811061397e57fe5b905060200201359050620186a061399f60328361422190919063ffffffff16565b816139a657fe5b048483815181106139b357fe5b602002602001018181525050613a348c8c848181106139ce57fe5b90506020020160208101906139e391906145f0565b8989858181106139ef57fe5b905060200201358c8c86818110613a0257fe5b9050602002016020810190613a1791906145f0565b73ffffffffffffffffffffffffffffffffffffffff169190614272565b50600101613968565b506040517fd9d1762300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c169063d9d1762390613a9e9033908c908c908c908c908a908d908d90600401614de8565b600060405180830381600087803b158015613ab857600080fd5b505af1158015613acc573d6000803e3d6000fd5b5050505060005b81811015612731576000898983818110613ae957fe5b9050602002016020810190613afe91906145f0565b9050613b5c613b1f858481518110613b1257fe5b6020026020010151613d44565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020906fffffffffffffffffffffffffffffffff1661441e565b613b6582613e8f565b1015613b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615651565b8b8b83818110613ba957fe5b9050602002016020810190613bbe91906145f0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a2232048b8b87818110613c2f57fe5b90506020020135888781518110613c4257fe5b6020026020010151604051613c589291906157da565b60405180910390a450600101613ad3565b600660209081526000928352604080842090915290825290205481565b82516000906fffffffffffffffffffffffffffffffff16613ca8575081613d3d565b835160208501516fffffffffffffffffffffffffffffffff91821691613cd091869116614221565b81613cd757fe5b049050818015613d2d57508284602001516fffffffffffffffffffffffffffffffff16613d2386600001516fffffffffffffffffffffffffffffffff168461422190919063ffffffff16565b81613d2a57fe5b04105b15613d3d576117cc816001613fb0565b9392505050565b60006fffffffffffffffffffffffffffffffff821115613d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906152e9565b5090565b8181016fffffffffffffffffffffffffffffffff8083169082161015613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615320565b92915050565b600083602001516fffffffffffffffffffffffffffffffff1660001415613e14575081613d3d565b602084015184516fffffffffffffffffffffffffffffffff91821691613e3c91869116614221565b81613e4357fe5b049050818015613d2d57508284600001516fffffffffffffffffffffffffffffffff16613d2386602001516fffffffffffffffffffffffffffffffff168461422190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a60205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081529192613de6927001000000000000000000000000000000009092046fffffffffffffffffffffffffffffffff16916370a0823190613f1d903090600401614dc7565b60206040518083038186803b158015613f3557600080fd5b505afa158015613f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f6d9190614bb6565b90613fb0565b80820382811115613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615131565b81810181811015613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615320565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b86868660405160240161402593929190614f27565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516140ae9190614d81565b6000604051808303816000865af19150503d80600081146140eb576040519150601f19603f3d011682016040523d82523d6000602084013e6140f0565b606091505b509150915081801561411a57508051158061411a57508080602001905181019061411a91906147d7565b614150576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906155e5565b505050505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f83306040516020016141b194939291906150bb565b6040516020818303038152906040528051906020012090505b919050565b8082036fffffffffffffffffffffffffffffffff8084169082161115613de6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067790615131565b600081158061423c5750508082028282828161423957fe5b04145b613de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610677906156f6565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016142a8929190614fa6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516143319190614d81565b6000604051808303816000865af19150503d806000811461436e576040519150601f19603f3d011682016040523d82523d6000602084013e614373565b606091505b509150915081801561439d57508051158061439d57508080602001905181019061439d91906147d7565b6143d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061520d565b5050505050565b600067ffffffffffffffff821115613d90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061549d565b600061444661442c83613d44565b84546fffffffffffffffffffffffffffffffff1690613d94565b83547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff919091169081179093555090919050565b600061444661449a83613d44565b84546fffffffffffffffffffffffffffffffff16906141cf565b60606044825110156144fa575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526141ca565b60048201915081806020019051810190613de69190614bce565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b60008083601f84011261455c578182fd5b50813567ffffffffffffffff811115614573578182fd5b602083019150836020808302850101111561458d57600080fd5b9250929050565b60008083601f8401126145a5578182fd5b50813567ffffffffffffffff8111156145bc578182fd5b60208301915083602082850101111561458d57600080fd5b8035613de6816158c6565b803560ff81168114613de657600080fd5b600060208284031215614601578081fd5b8135613d3d816158c6565b6000806040838503121561461e578081fd5b8235614629816158c6565b91506020830135614639816158c6565b809150509250929050565b60008060008060008060c0878903121561465c578182fd5b8635614667816158c6565b95506020870135614677816158c6565b94506040870135614687816158eb565b935061469688606089016145df565b92506080870135915060a087013590509295509295509295565b600080604083850312156146c2578182fd5b82356146cd816158c6565b91506020830135614639816158eb565b6000806000606084860312156146f1578283fd5b83356146fc816158c6565b9250602084013561470c816158eb565b9150604084013561471c816158eb565b809150509250925092565b6000806000806060858703121561473c578384fd5b8435614747816158c6565b9350602085013567ffffffffffffffff811115614762578384fd5b61476e87828801614594565b9094509250506040850135614782816158eb565b939692955090935050565b6000806000604084860312156147a1578081fd5b833567ffffffffffffffff8111156147b7578182fd5b6147c38682870161454b565b909450925050602084013561471c816158eb565b6000602082840312156147e8578081fd5b8151613d3d816158eb565b600080600080600080600080600060a08a8c031215614810578687fd5b893561481b816158c6565b985060208a013567ffffffffffffffff80821115614837578889fd5b6148438d838e0161454b565b909a50985060408c013591508082111561485b578485fd5b6148678d838e0161454b565b909850965060608c013591508082111561487f578485fd5b61488b8d838e0161454b565b909650945060808c01359150808211156148a3578384fd5b506148b08c828d01614594565b915080935050809150509295985092959850929598565b6000806040838503121561461e578182fd5b600080600080608085870312156148ee578182fd5b84356148f9816158c6565b93506020850135614909816158c6565b92506040850135614919816158c6565b9396929550929360600135925050565b600080600080600060a08688031215614940578283fd5b853561494b816158c6565b9450602086013561495b816158c6565b9350604086013561496b816158c6565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b03121561499f578182fd5b88356149aa816158c6565b975060208901356149ba816158c6565b965060408901356149ca816158c6565b955060608901359450608089013593506149e78a60a08b016145df565b925060c0890135915060e089013590509295985092959890939650565b60008060008060008060808789031215614a1c578384fd5b8635614a27816158c6565b95506020870135614a37816158c6565b9450604087013567ffffffffffffffff80821115614a53578586fd5b614a5f8a838b0161454b565b90965094506060890135915080821115614a77578384fd5b50614a8489828a0161454b565b979a9699509497509295939492505050565b600080600060608486031215614aaa578081fd5b8335614ab5816158c6565b92506020840135614ac5816158eb565b929592945050506040919091013590565b600080600060608486031215614aea578081fd5b8335614af5816158c6565b925060208401359150604084013561471c816158eb565b60008060408385031215614b1e578182fd5b8235614b29816158c6565b9150602083013567ffffffffffffffff81168114614639578182fd5b60008060008060008060a08789031215614b5d578384fd5b8635614b68816158c6565b95506020870135614b78816158c6565b94506040870135614b88816158c6565b935060608701359250608087013567ffffffffffffffff811115614baa578283fd5b614a8489828a01614594565b600060208284031215614bc7578081fd5b5051919050565b600060208284031215614bdf578081fd5b815167ffffffffffffffff80821115614bf6578283fd5b818401915084601f830112614c09578283fd5b815181811115614c17578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715614c55578586fd5b604052818152838201602001871015614c6c578485fd5b614c7d826020830160208701615896565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff16815260200190565b6000815180845260208085019450808401835b83811015614cd457815187529582019590820190600101614cb8565b509495945050505050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008151808452614d3f816020860160208601615896565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b60008251614d93818460208701615896565b9190910192915050565b60008451614daf818460208901615896565b91909101928352506020820152604001919050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060a0820173ffffffffffffffffffffffffffffffffffffffff8b168352602060a08185015281614e1a8b84615071565b90508b9250835b8b811015614e4c57828401614e3f83614e3a83886145d4565b614c87565b9094509150600101614e21565b5084810360408601528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff891115614e84578384fd5b8189029250828a8383013782810192505080820183815281858403016060860152614eaf8189614ca5565b925050508281036080840152614ec6818587614cdf565b9b9a5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a06080830152614f1b60a083018486614cdf565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015615007578151151584529284019290840190600101614fe9565b5050508381038285015280855161501e8184615071565b91508192508381028201848801865b83811015615057578583038552615045838351614d27565b9487019492509086019060010161502d565b50909998505050505050505050565b901515815260200190565b90815260200190565b958652602086019490945273ffffffffffffffffffffffffffffffffffffffff9283166040860152911660608401521515608083015260a082015260c00190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526117cc602083018486614cdf565b600060208252613d3d6020830184614d27565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b60208082526017908201527f42656e746f426f783a20536b696d20746f6f206d756368000000000000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526016908201527f42656e746f426f783a2063616e6e6f7420656d70747900000000000000000000604082015260600190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b60208082526013908201527f42656e746f426f783a204e6f20746f6b656e7300000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526017908201527f42656e746f426f783a20746f5b305d206e6f7420736574000000000000000000604082015260600190565b60208082526014908201527f42656e746f426f783a20746f206e6f7420736574000000000000000000000000604082015260600190565b6020808252601a908201527f53747261746567794d616e616765723a20546f6f206561726c79000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f42656e746f426f783a205472616e73666572206e6f7420617070726f76656400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601b908201527f42656e746f426f783a206e6f206d6173746572436f6e74726163740000000000604082015260600190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b60208082526016908201527f42656e746f426f783a2057726f6e6720616d6f756e7400000000000000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b6020808252601d908201527f42656e746f426f783a20455448207472616e73666572206661696c6564000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f53747261746567794d616e616765723a2054617267657420746f6f2068696768604082015260600190565b6fffffffffffffffffffffffffffffffff91909116815260200190565b6fffffffffffffffffffffffffffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b918252602082015260400190565b67ffffffffffffffff91909116815260200190565b67ffffffffffffffff93841681529190921660208201526fffffffffffffffffffffffffffffffff909116604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615867578283fd5b83018035915067ffffffffffffffff821115615881578283fd5b60200191503681900382131561458d57600080fd5b60005b838110156158b1578181015183820152602001615899565b838111156158c0576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146158e857600080fd5b50565b80151581146158e857600080fdfea2646970667358221220c1735d279c8bc8f393c35e3cf33b5a234c4c73a8b1b30818c98831e89274909f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xD2423B51 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF1676D37 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xF1676D37 EQ PUSH2 0x555 JUMPI DUP1 PUSH4 0xF18D03CC EQ PUSH2 0x575 JUMPI DUP1 PUSH4 0xF483B3DA EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0xF7888AEC EQ PUSH2 0x5B5 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x4D0 JUMPI DUP1 PUSH4 0xDA5139CA EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xDF23B45B EQ PUSH2 0x511 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x540 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x97DA6D30 GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0x97DA6D30 EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x47B JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x490 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x4B0 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x426 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x43B JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x56623118 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x56623118 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x66C6BB0B EQ PUSH2 0x386 JUMPI DUP1 PUSH4 0x72CB5D97 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x3C6 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E EQ PUSH2 0x2E3 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x303 JUMPI DUP1 PUSH4 0x4FFE34DB EQ PUSH2 0x318 JUMPI DUP1 PUSH4 0x5108A558 EQ PUSH2 0x346 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x12A90C8A GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0x254 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0x228BFD9F EQ PUSH2 0x2A1 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x2C1 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x2B9446C EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x212 JUMPI DUP1 PUSH4 0xFCA8843 EQ PUSH2 0x234 JUMPI PUSH2 0x1E3 JUMP JUMPDEST CALLDATASIZE PUSH2 0x1E3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FB PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4929 JUMP JUMPDEST PUSH2 0x5D5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x22D CALLDATASIZE PUSH1 0x4 PUSH2 0x46DD JUMP JUMPDEST PUSH2 0xC8C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x24F CALLDATASIZE PUSH1 0x4 PUSH2 0x4A04 JUMP JUMPDEST PUSH2 0xE17 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x26F CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x11D9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x5066 JUMP JUMPDEST PUSH2 0x294 PUSH2 0x28F CALLDATASIZE PUSH1 0x4 PUSH2 0x4727 JUMP JUMPDEST PUSH2 0x11EE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x4DC7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2BC CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x1457 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x147F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x2FE CALLDATASIZE PUSH1 0x4 PUSH2 0x4B0C JUMP JUMPDEST PUSH2 0x14DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x1613 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x338 PUSH2 0x333 CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x16F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x57B7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x361 CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x1735 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x381 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AD6 JUMP JUMPDEST PUSH2 0x175D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A96 JUMP JUMPDEST PUSH2 0x17D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x48C7 JUMP JUMPDEST PUSH2 0x1F89 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x46B0 JUMP JUMPDEST PUSH2 0x2588 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x4983 JUMP JUMPDEST PUSH2 0x26A5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x421 CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x273F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x432 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2751 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x456 CALLDATASIZE PUSH1 0x4 PUSH2 0x460C JUMP JUMPDEST PUSH2 0x276D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FB PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x4929 JUMP JUMPDEST PUSH2 0x278D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x2D7D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x4AB CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x2DDC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x4CB CALLDATASIZE PUSH1 0x4 PUSH2 0x4644 JUMP JUMPDEST PUSH2 0x2E04 JUMP JUMPDEST PUSH2 0x4E3 PUSH2 0x4DE CALLDATASIZE PUSH1 0x4 PUSH2 0x478D JUMP JUMPDEST PUSH2 0x325D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x4FCC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x50C CALLDATASIZE PUSH1 0x4 PUSH2 0x4AD6 JUMP JUMPDEST PUSH2 0x3409 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x531 PUSH2 0x52C CALLDATASIZE PUSH1 0x4 PUSH2 0x45F0 JUMP JUMPDEST PUSH2 0x3478 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x57FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x34CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x561 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x570 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B45 JUMP JUMPDEST PUSH2 0x34E9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x590 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D9 JUMP JUMPDEST PUSH2 0x36C4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x5B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x47F3 JUMP JUMPDEST PUSH2 0x391E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x5D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x48C7 JUMP JUMPDEST PUSH2 0x3C69 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x615 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x6EE JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x680 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x6EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0x73B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x538E JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ISZERO PUSH2 0x75F JUMPI DUP9 PUSH2 0x781 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x78B PUSH2 0x4514 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP3 DIV AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ISZERO ISZERO DUP1 PUSH2 0x87C JUMPI POP PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x842 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x856 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x87A SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST GT JUMPDEST PUSH2 0x8B2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x52B2 JUMP JUMPDEST DUP6 PUSH2 0x91C JUMPI PUSH2 0x8C3 DUP2 DUP9 PUSH1 0x0 PUSH2 0x3C86 JUMP JUMPDEST SWAP6 POP PUSH2 0x3E8 PUSH2 0x8F1 PUSH2 0x8D4 DUP9 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x917 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP PUSH2 0xC81 JUMP JUMPDEST PUSH2 0x92B JUMP JUMPDEST PUSH2 0x928 DUP2 DUP8 PUSH1 0x1 PUSH2 0x3DEC JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ADDRESS EQ ISZERO DUP1 PUSH2 0x964 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND ISZERO JUMPDEST DUP1 PUSH2 0x995 JUMPI POP DUP1 MLOAD PUSH2 0x991 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x98B DUP5 PUSH2 0x3E8F JUMP JUMPDEST SWAP1 PUSH2 0x3F73 JUMP JUMPDEST DUP8 GT ISZERO JUMPDEST PUSH2 0x9CB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5168 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0xA08 SWAP1 DUP8 PUSH2 0x3FB0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0xA64 PUSH2 0xA47 DUP8 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xAA1 PUSH2 0xA87 DUP9 PUSH2 0x3D44 JUMP JUMPDEST DUP3 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD DUP6 AND PUSH17 0x100000000000000000000000000000000 MUL SWAP1 DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE DUP11 AND PUSH2 0xBBB JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0xBFA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ADDRESS EQ PUSH2 0xBFA JUMPI PUSH2 0xBFA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP11 ADDRESS DUP11 PUSH2 0x3FED JUMP JUMPDEST DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB2346165E782564F17F5B7E555C21F4FD96FBC93458572BF0113EA35A958FC55 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xC70 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP7 SWAP5 POP DUP6 SWAP4 POP POP POP JUMPDEST POP SWAP6 POP SWAP6 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xCDD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST DUP2 ISZERO PUSH2 0xDD1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xD04 JUMPI POP DUP1 JUMPDEST PUSH2 0xD3A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x527B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0xE12 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0xE54 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0xF24 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0xEB6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xF22 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP3 DUP2 PUSH2 0xF30 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xF45 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xF93 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5357 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1157 JUMPI PUSH1 0x0 DUP9 DUP9 DUP4 DUP2 DUP2 LT PUSH2 0xFAE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xFC3 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST SWAP1 POP PUSH2 0x1066 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0xFD4 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x6 PUSH1 0x0 DUP15 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x3FB0 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP14 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x10BE DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x10A8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP6 PUSH2 0x3FB0 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP4 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0x1132 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD PUSH2 0x1146 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0xF98 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x1195 SWAP1 DUP4 PUSH2 0x3F73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP10 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP12 SWAP1 SWAP13 AND DUP3 MSTORE SWAP10 SWAP1 SWAP10 MSTORE SWAP9 SWAP1 SWAP8 KECCAK256 SWAP8 SWAP1 SWAP8 SSTORE POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x123D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5542 JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x12C6 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x125A SWAP3 SWAP2 SWAP1 PUSH2 0x4D71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x1322 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x4DDF47D400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x13B5 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x510A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x13CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1446 SWAP3 SWAP2 SWAP1 PUSH2 0x510A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x14B7 JUMPI PUSH2 0x14B2 DUP2 PUSH2 0x4158 JUMP JUMPDEST PUSH2 0x14D9 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1530 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST PUSH1 0x5F DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT ISZERO PUSH2 0x1575 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x572D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND PUSH9 0x10000000000000000 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 AND MUL OR SWAP1 SSTORE MLOAD PUSH32 0x7543AF99B5602C06E62DA0631B5308489A5FF859150105A623B6EB15E8DEAE0B SWAP1 PUSH2 0x1607 SWAP1 DUP5 SWAP1 PUSH2 0x57E8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x1665 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5468 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP2 PUSH17 0x100000000000000000000000000000000 SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x17CC SWAP1 DUP5 DUP5 PUSH2 0x3DEC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x17DC PUSH2 0x452B JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH9 0x10000000000000000 DUP3 DIV AND DUP3 DUP6 ADD MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 DUP4 ADD SWAP1 DUP2 MSTORE SWAP5 DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 MLOAD SWAP1 MLOAD PUSH32 0x18FCCC7600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 DUP4 SWAP2 PUSH4 0x18FCCC76 SWAP2 PUSH2 0x18AB SWAP2 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x577F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x18D9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18FD SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x190B JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x1918 JUMPI POP POP POP PUSH2 0xE12 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP3 SGT ISZERO PUSH2 0x1A12 JUMPI DUP2 PUSH2 0x1963 DUP3 DUP3 PUSH2 0x3FB0 JUMP JUMPDEST SWAP2 POP PUSH2 0x196E DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 SWAP1 PUSH2 0x1A04 SWAP1 DUP5 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x1B2D JUMP JUMPDEST PUSH1 0x0 DUP3 SLT ISZERO PUSH2 0x1B2D JUMPI PUSH1 0x0 DUP3 SWAP1 SUB PUSH2 0x1A2A DUP3 DUP3 PUSH2 0x3F73 JUMP JUMPDEST SWAP2 POP PUSH2 0x1A35 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1AC2 PUSH2 0x1AA5 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 SWAP1 PUSH2 0x1B23 SWAP1 DUP5 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP6 ISZERO PUSH2 0x1EB1 JUMPI PUSH1 0x0 PUSH1 0x64 PUSH2 0x1B58 DUP7 PUSH1 0x20 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x1B5F JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x1CFE JUMPI PUSH1 0x0 PUSH2 0x1BAB DUP7 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH2 0x3F73 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1BBB JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x1BC3 JUMPI POP DUP6 JUMPDEST PUSH2 0x1BE4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND DUP7 DUP4 PUSH2 0x4272 JUMP JUMPDEST PUSH2 0x1C0D PUSH2 0x1BF0 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH32 0x6939AAF500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x6939AAF5 SWAP1 PUSH2 0x1C78 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1CA6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB18E7E4F6EAC147A63A3BB6BEB2D9039C88698623AFF3EFC4FEBBC20B0164EE5 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1CF0 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x1EAF JUMP JUMPDEST DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT ISZERO PUSH2 0x1EAF JUMPI PUSH1 0x0 PUSH2 0x1D47 PUSH2 0x1D2A DUP4 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1D69 JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x1D71 JUMPI POP DUP6 JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1DC6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1DF4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1E18 SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E43 PUSH2 0x1E26 DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x40 DUP10 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A SWAP1 PUSH2 0x1EA4 SWAP1 DUP5 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMPDEST POP JUMPDEST POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD SWAP4 SWAP1 SWAP5 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH17 0x100000000000000000000000000000000 MUL PUSH8 0xFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH9 0x10000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP7 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP4 SWAP1 SWAP4 OR SWAP2 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1FDA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST PUSH2 0x1FE2 PUSH2 0x452B JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH9 0x10000000000000000 DUP3 DIV DUP2 AND DUP4 DUP7 ADD MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 DUP5 ADD MSTORE SWAP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP2 MLOAD SWAP2 SWAP4 AND SWAP2 AND ISZERO DUP1 PUSH2 0x20AC JUMPI POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x2164 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP2 DUP6 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x210D TIMESTAMP PUSH2 0x43DA JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP2 SWAP1 DUP7 AND SWAP1 PUSH32 0x6F7CCDF3F86039E5A1DCF6028BF7B4773CBF7A234716BA2E5392B12BB0F8558F SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH2 0x24B4 JUMP JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2189 JUMPI POP DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND TIMESTAMP LT ISZERO JUMPDEST PUSH2 0x21BF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53C5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2418 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD DUP6 DUP3 ADD MLOAD SWAP2 MLOAD PUSH32 0x7F8661A100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP3 SWAP4 AND SWAP2 PUSH4 0x7F8661A1 SWAP2 PUSH2 0x2253 SWAP2 PUSH1 0x4 ADD PUSH2 0x5762 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x226D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2281 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x22A5 SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 SGT ISZERO PUSH2 0x2336 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP2 SWAP1 PUSH2 0x22E1 SWAP1 DUP3 PUSH2 0x441E JUMP JUMPDEST POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2328 SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x23C4 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT ISZERO PUSH2 0x23C4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 DUP3 SWAP1 SUB SWAP1 PUSH2 0x2373 SWAP1 DUP3 PUSH2 0x448C JUMP JUMPDEST POP DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 DUP3 PUSH1 0x40 MLOAD PUSH2 0x23BA SWAP2 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A DUP5 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x240E SWAP2 SWAP1 PUSH2 0x5762 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 DUP9 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE DUP4 DUP9 MSTORE DUP8 DUP3 ADD DUP5 SWAP1 MSTORE DUP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD SWAP1 SWAP3 AND SWAP1 SWAP2 SSTORE MLOAD SWAP3 DUP7 AND SWAP3 PUSH32 0x3E6352A885ADC4CC54767592939C3B1BBD65685658C3BEAABA66A888120E217 SWAP2 SWAP1 LOG3 JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD SWAP4 SWAP1 SWAP6 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP3 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP6 DUP7 AND OR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND PUSH9 0x10000000000000000 SWAP6 SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 MUL SWAP2 SWAP1 SWAP2 OR PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH17 0x100000000000000000000000000000000 SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x25D9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x53FC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x2626 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x519F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x1607 SWAP1 DUP5 SWAP1 PUSH2 0x5066 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD505ACCF00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0x2703 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x4F58 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x271D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2731 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x27CD JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x289D JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x282F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x289B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0x28EA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x538E JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND ISZERO PUSH2 0x290E JUMPI DUP9 PUSH2 0x2930 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x293A PUSH2 0x4514 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP5 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV AND SWAP1 DUP3 ADD MSTORE DUP6 PUSH2 0x29B5 JUMPI PUSH2 0x29AE DUP2 DUP9 PUSH1 0x1 PUSH2 0x3C86 JUMP JUMPDEST SWAP6 POP PUSH2 0x29C4 JUMP JUMPDEST PUSH2 0x29C1 DUP2 DUP8 PUSH1 0x0 PUSH2 0x3DEC JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x2A01 SWAP1 DUP8 PUSH2 0x3F73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP15 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x2A5A PUSH2 0x2A40 DUP9 PUSH2 0x3D44 JUMP JUMPDEST DUP3 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH2 0x2A97 PUSH2 0x2A7A DUP8 PUSH2 0x3D44 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO DUP1 PUSH2 0x2AD4 JUMPI POP PUSH1 0x20 DUP2 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO JUMPDEST PUSH2 0x2B0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5244 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND OR DUP2 AND PUSH17 0x100000000000000000000000000000000 SWAP2 SWAP1 SWAP4 AND MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP11 AND PUSH2 0x2CE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x2C0B SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH1 0x40 MLOAD PUSH2 0x2C63 SWAP1 PUSH2 0x4DC4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2CA0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2CA5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2CE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x56BF JUMP JUMPDEST POP PUSH2 0x2D07 JUMP JUMPDEST PUSH2 0x2D07 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP10 DUP10 PUSH2 0x4272 JUMP JUMPDEST DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xAD9AB9EE6953D4D177F4A03B3A3AC3178FFCB9816319F348060194AA76B14486 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xC70 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x2E51 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5577 JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0x2E5D JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x2E6A JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0x2F81 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x2EBE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x51D6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2F1D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x54D4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x2F7C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5688 JUMP JUMPDEST PUSH2 0x31BE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0x2FCE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x561A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x300E PUSH2 0x147F JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0x305A JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0x307C JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0x30C3 SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0x507A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x30EB SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4D9D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x3128 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x50EC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x314A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x31BB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x550B JUMP JUMPDEST POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0x324D SWAP1 DUP9 SWAP1 PUSH2 0x5066 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x3277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x32A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x32BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x32EF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x32DA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x3400 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x330E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x3320 SWAP2 SWAP1 PUSH2 0x5833 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x332E SWAP3 SWAP2 SWAP1 PUSH2 0x4D71 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3369 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x336E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x337D JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x3386 DUP3 PUSH2 0x44B4 JUMP JUMPDEST SWAP1 PUSH2 0x33BE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP2 SWAP1 PUSH2 0x511E JUMP JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x33CC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x33EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x32F5 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND DUP4 MSTORE PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x17CC SWAP1 DUP5 DUP5 PUSH2 0x3C86 JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP2 PUSH9 0x10000000000000000 DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x34FA DUP6 PUSH1 0x32 PUSH2 0x4221 JUMP JUMPDEST DUP2 PUSH2 0x3501 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x3525 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP8 DUP7 PUSH2 0x4272 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23E30C8B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND SWAP1 PUSH4 0x23E30C8B SWAP1 PUSH2 0x3581 SWAP1 CALLER SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x4ED5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x359B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x35AF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x35FC PUSH2 0x35BF DUP3 PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x441E JUMP JUMPDEST PUSH2 0x3605 DUP7 PUSH2 0x3E8F JUMP JUMPDEST LT ISZERO PUSH2 0x363D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5651 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP8 DUP6 PUSH1 0x40 MLOAD PUSH2 0x36B3 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x3701 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x37D1 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x3763 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x37CF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5431 JUMP JUMPDEST POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x381E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x538E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x385B SWAP1 DUP4 PUSH2 0x3F73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x38A4 SWAP1 DUP4 PUSH2 0x3FB0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP7 AND DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE MLOAD SWAP2 DUP8 AND SWAP2 PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A SWAP1 PUSH2 0x390F SWAP1 DUP8 SWAP1 PUSH2 0x5071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x3937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x3961 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3A3D JUMPI PUSH1 0x0 DUP8 DUP8 DUP4 DUP2 DUP2 LT PUSH2 0x397E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH3 0x186A0 PUSH2 0x399F PUSH1 0x32 DUP4 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x39A6 JUMPI INVALID JUMPDEST DIV DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x39B3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x3A34 DUP13 DUP13 DUP5 DUP2 DUP2 LT PUSH2 0x39CE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x39E3 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST DUP10 DUP10 DUP6 DUP2 DUP2 LT PUSH2 0x39EF JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP13 DUP13 DUP7 DUP2 DUP2 LT PUSH2 0x3A02 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3A17 SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 SWAP1 PUSH2 0x4272 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3968 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0xD9D1762300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP1 PUSH4 0xD9D17623 SWAP1 PUSH2 0x3A9E SWAP1 CALLER SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP11 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4DE8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3AB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3ACC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2731 JUMPI PUSH1 0x0 DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x3AE9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3AFE SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST SWAP1 POP PUSH2 0x3B5C PUSH2 0x3B1F DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x3B12 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D44 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x441E JUMP JUMPDEST PUSH2 0x3B65 DUP3 PUSH2 0x3E8F JUMP JUMPDEST LT ISZERO PUSH2 0x3B9D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5651 JUMP JUMPDEST DUP12 DUP12 DUP4 DUP2 DUP2 LT PUSH2 0x3BA9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3BBE SWAP2 SWAP1 PUSH2 0x45F0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP15 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP12 DUP12 DUP8 DUP2 DUP2 LT PUSH2 0x3C2F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x3C42 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x3C58 SWAP3 SWAP2 SWAP1 PUSH2 0x57DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0x3AD3 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3CA8 JUMPI POP DUP2 PUSH2 0x3D3D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH2 0x3CD0 SWAP2 DUP7 SWAP2 AND PUSH2 0x4221 JUMP JUMPDEST DUP2 PUSH2 0x3CD7 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x3D2D JUMPI POP DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3D23 DUP7 PUSH1 0x0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x3D2A JUMPI INVALID JUMPDEST DIV LT JUMPDEST ISZERO PUSH2 0x3D3D JUMPI PUSH2 0x17CC DUP2 PUSH1 0x1 PUSH2 0x3FB0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3D90 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x52E9 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 EQ ISZERO PUSH2 0x3E14 JUMPI POP DUP2 PUSH2 0x3D3D JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH2 0x3E3C SWAP2 DUP7 SWAP2 AND PUSH2 0x4221 JUMP JUMPDEST DUP2 PUSH2 0x3E43 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x3D2D JUMPI POP DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3D23 DUP7 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x4221 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 PUSH2 0x3DE6 SWAP3 PUSH17 0x100000000000000000000000000000000 SWAP1 SWAP3 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH4 0x70A08231 SWAP1 PUSH2 0x3F1D SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x4DC7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3F35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3F49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3F6D SWAP2 SWAP1 PUSH2 0x4BB6 JUMP JUMPDEST SWAP1 PUSH2 0x3FB0 JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5131 JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5320 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x4025 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4F27 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x40AE SWAP2 SWAP1 PUSH2 0x4D81 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40EB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40F0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x411A JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x411A JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x411A SWAP2 SWAP1 PUSH2 0x47D7 JUMP JUMPDEST PUSH2 0x4150 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x55E5 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x41B1 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x50BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 DUP3 SUB PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND SWAP1 DUP3 AND GT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x5131 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x423C JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x4239 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0x3DE6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x56F6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x42A8 SWAP3 SWAP2 SWAP1 PUSH2 0x4FA6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x4331 SWAP2 SWAP1 PUSH2 0x4D81 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x436E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4373 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x439D JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x439D JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x439D SWAP2 SWAP1 PUSH2 0x47D7 JUMP JUMPDEST PUSH2 0x43D3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x520D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3D90 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x677 SWAP1 PUSH2 0x549D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4446 PUSH2 0x442C DUP4 PUSH2 0x3D44 JUMP JUMPDEST DUP5 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x3D94 JUMP JUMPDEST DUP4 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP1 DUP2 OR SWAP1 SWAP4 SSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4446 PUSH2 0x449A DUP4 PUSH2 0x3D44 JUMP JUMPDEST DUP5 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH2 0x41CF JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x44FA JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x41CA JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3DE6 SWAP2 SWAP1 PUSH2 0x4BCE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x455C JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4573 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x458D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x45A5 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x45BC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x458D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x3DE6 DUP2 PUSH2 0x58C6 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x3DE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4601 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D3D DUP2 PUSH2 0x58C6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x461E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4629 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4639 DUP2 PUSH2 0x58C6 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x465C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4667 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4677 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x4687 DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP4 POP PUSH2 0x4696 DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x45DF JUMP JUMPDEST SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x46C2 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x46CD DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4639 DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x46F1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x46FC DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x470C DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x471C DUP2 PUSH2 0x58EB JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x473C JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4747 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4762 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x476E DUP8 DUP3 DUP9 ADD PUSH2 0x4594 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x4782 DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x47A1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x47B7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x47C3 DUP7 DUP3 DUP8 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x471C DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47E8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x3D3D DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP11 DUP13 SUB SLT ISZERO PUSH2 0x4810 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP10 CALLDATALOAD PUSH2 0x481B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP9 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4837 JUMPI DUP9 DUP10 REVERT JUMPDEST PUSH2 0x4843 DUP14 DUP4 DUP15 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH1 0x40 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x485B JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4867 DUP14 DUP4 DUP15 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x487F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x488B DUP14 DUP4 DUP15 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x48A3 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x48B0 DUP13 DUP3 DUP14 ADD PUSH2 0x4594 JUMP JUMPDEST SWAP2 POP DUP1 SWAP4 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x461E JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x48EE JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x48F9 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x4909 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x4919 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x4940 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x494B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x495B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x496B DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x499F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x49AA DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x49BA DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x49CA DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH2 0x49E7 DUP11 PUSH1 0xA0 DUP12 ADD PUSH2 0x45DF JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD SWAP2 POP PUSH1 0xE0 DUP10 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 SWAP1 SWAP4 SWAP7 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4A1C JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4A27 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4A37 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4A53 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x4A5F DUP11 DUP4 DUP12 ADD PUSH2 0x454B JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A77 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x4A84 DUP10 DUP3 DUP11 ADD PUSH2 0x454B JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4AAA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4AB5 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4AC5 DUP2 PUSH2 0x58EB JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4AEA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4AF5 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x471C DUP2 PUSH2 0x58EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B1E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4B29 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4639 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4B5D JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4B68 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4B78 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x4B88 DUP2 PUSH2 0x58C6 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4BAA JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4A84 DUP10 DUP3 DUP11 ADD PUSH2 0x4594 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4BC7 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4BDF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4BF6 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4C09 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x4C17 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x4C55 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x4C6C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4C7D DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5896 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4CD4 JUMPI DUP2 MLOAD DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4CB8 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x4D3F DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5896 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4D93 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5896 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD PUSH2 0x4DAF DUP2 DUP5 PUSH1 0x20 DUP10 ADD PUSH2 0x5896 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 MSTORE PUSH1 0x20 PUSH1 0xA0 DUP2 DUP6 ADD MSTORE DUP2 PUSH2 0x4E1A DUP12 DUP5 PUSH2 0x5071 JUMP JUMPDEST SWAP1 POP DUP12 SWAP3 POP DUP4 JUMPDEST DUP12 DUP2 LT ISZERO PUSH2 0x4E4C JUMPI DUP3 DUP5 ADD PUSH2 0x4E3F DUP4 PUSH2 0x4E3A DUP4 DUP9 PUSH2 0x45D4 JUMP JUMPDEST PUSH2 0x4C87 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP2 POP PUSH1 0x1 ADD PUSH2 0x4E21 JUMP JUMPDEST POP DUP5 DUP2 SUB PUSH1 0x40 DUP7 ADD MSTORE DUP9 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 GT ISZERO PUSH2 0x4E84 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP10 MUL SWAP3 POP DUP3 DUP11 DUP4 DUP4 ADD CALLDATACOPY DUP3 DUP2 ADD SWAP3 POP POP DUP1 DUP3 ADD DUP4 DUP2 MSTORE DUP2 DUP6 DUP5 SUB ADD PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x4EAF DUP2 DUP10 PUSH2 0x4CA5 JUMP JUMPDEST SWAP3 POP POP POP DUP3 DUP2 SUB PUSH1 0x80 DUP5 ADD MSTORE PUSH2 0x4EC6 DUP2 DUP6 DUP8 PUSH2 0x4CDF JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND DUP4 MSTORE DUP1 DUP9 AND PUSH1 0x20 DUP5 ADD MSTORE POP DUP6 PUSH1 0x40 DUP4 ADD MSTORE DUP5 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x4F1B PUSH1 0xA0 DUP4 ADD DUP5 DUP7 PUSH2 0x4CDF JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5007 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4FE9 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x501E DUP2 DUP5 PUSH2 0x5071 JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5057 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x5045 DUP4 DUP4 MLOAD PUSH2 0x4D27 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x502D JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x17CC PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x4CDF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x3D3D PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4D27 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20556E646572666C6F770000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20536B696D20746F6F206D756368000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A2063616E6E6F7420656D70747900000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A207A65726F20616464726573730000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A204E6F20746F6B656E7300000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20746F5B305D206E6F7420736574000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20746F206E6F7420736574000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A20546F6F206561726C79000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A205472616E73666572206E6F7420617070726F76656400 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A206E6F206D6173746572436F6E74726163740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E7366657246726F6D206661696C6564 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A2057726F6E6720616D6F756E7400000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20455448207472616E73666572206661696C6564000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A2054617267657420746F6F2068696768 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5867 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5881 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x458D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x58B1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5899 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x58C0 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x58E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x58E8 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC1 PUSH20 0x5D279C8BC8F393C35E3CF33B5A234C4C73A8B1B3 ADDMOD XOR 0xC9 DUP9 BALANCE 0xE8 SWAP3 PUSH21 0x909F64736F6C634300060C00330000000000000000 ",
              "sourceMap": "27784:23045:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33738:2830;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;14182:489;;;;;;;;;;-1:-1:-1;14182:489:0;;;;;:::i;:::-;;:::i;:::-;;40477:723;;;;;;;;;;-1:-1:-1;40477:723:0;;;;;:::i;:::-;;:::i;18910:58::-;;;;;;;;;;-1:-1:-1;18910:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16611:1670::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30290:44::-;;;;;;;;;;-1:-1:-1;30290:44:0;;;;;:::i;:::-;;:::i;20243:262::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44672:370::-;;;;;;;;;;-1:-1:-1;44672:370:0;;;;;:::i;:::-;;:::i;14750:330::-;;;;;;;;;;;;;:::i;30244:39::-;;;;;;;;;;-1:-1:-1;30244:39:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;30340:51::-;;;;;;;;;;-1:-1:-1;30340:51:0;;;;;:::i;:::-;;:::i;33003:195::-;;;;;;;;;;-1:-1:-1;33003:195:0;;;;;:::i;:::-;;:::i;48241:2421::-;;;;;;;;;;-1:-1:-1;48241:2421:0;;;;;:::i;:::-;;:::i;45843:1658::-;;;;;;;;;;-1:-1:-1;45843:1658:0;;;;;:::i;:::-;;:::i;20864:343::-;;;;;;;;;;-1:-1:-1;20864:343:0;;;;;:::i;:::-;;:::i;27063:269::-;;;;;;;;;;-1:-1:-1;27063:269:0;;;;;:::i;:::-;;:::i;19031:41::-;;;;;;;;;;-1:-1:-1;19031:41:0;;;;;:::i;:::-;;:::i;13346:20::-;;;;;;;;;;;;;:::i;18742:74::-;;;;;;;;;;-1:-1:-1;18742:74:0;;;;;:::i;:::-;;:::i;36960:2114::-;;;;;;;;;;-1:-1:-1;36960:2114:0;;;;;:::i;:::-;;:::i;20635:139::-;;;;;;;;;;;;;:::i;16029:51::-;;;;;;;;;;-1:-1:-1;16029:51:0;;;;;:::i;:::-;;:::i;21964:2547::-;;;;;;;;;;-1:-1:-1;21964:2547:0;;;;;:::i;:::-;;:::i;26156:521::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;32516:191::-;;;;;;;;;;-1:-1:-1;32516:191:0;;;;;:::i;:::-;;:::i;30397:51::-;;;;;;;;;;-1:-1:-1;30397:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;13372:27::-;;;;;;;;;;;;;:::i;41952:550::-;;;;;;;;;;-1:-1:-1;41952:550:0;;;;;:::i;:::-;;:::i;39576:459::-;;;;;;;;;;-1:-1:-1;39576:459:0;;;;;:::i;:::-;;:::i;43397:932::-;;;;;;;;;;-1:-1:-1;43397:932:0;;;;;:::i;:::-;;:::i;30139:63::-;;;;;;;;;;-1:-1:-1;30139:63:0;;;;;:::i;:::-;;:::i;33738:2830::-;33911:17;;33896:4;31316:18;;;31324:10;31316:18;;;;:43;;-1:-1:-1;31338:21:0;;;31354:4;31338:21;;31316:43;31312:361;;;31467:10;31425:22;31450:28;;;:16;:28;;;;;;;;31500;31492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31582:38;;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31574:88;;;;;;;;;;;;:::i;:::-;31312:361;;33984:16:::1;::::0;::::1;33976:49;;;;;;;;;;;;:::i;:::-;34095:12;34110:22;::::0;::::1;::::0;:43:::1;;34147:6;34110:43;;;34135:9;34110:43;34095:58;;34163:19;;:::i;:::-;-1:-1:-1::0;34185:13:0::1;::::0;::::1;;::::0;;;:6:::1;:13;::::0;;;;;;;;34163:35;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;::::1;::::0;;;;34338:18;::::1;::::0;:45:::1;;;34382:1;34360:5;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:23;34338:45;34330:77;;;;;;;;;;;;:::i;:::-;34421:10:::0;34417:595:::1;;34545:27;:5:::0;34558:6;34566:5:::1;34545:12;:27::i;:::-;34537:35;;29953:4;34709:29;34724:13;:5;:11;:13::i;:::-;34709:10;::::0;::::1;::::0;:14:::1;;::::0;::::1;:29::i;:::-;:53;;;34705:105;;;34790:1;34793::::0;34782:13:::1;;;;;;;;34705:105;34417:595;;;34973:28;:5:::0;34989;34996:4:::1;34973:15;:28::i;:::-;34964:37;;34417:595;35326:21;::::0;::::1;35342:4;35326:21;;::::0;:47:::1;;-1:-1:-1::0;35351:22:0::1;::::0;::::1;::::0;35326:47:::1;:102;;;-1:-1:-1::0;35414:13:0;;35387:41:::1;::::0;::::1;;:22;35403:5:::0;35387:15:::1;:22::i;:::-;:26:::0;::::1;:41::i;:::-;35377:6;:51;;35326:102;35305:172;;;;;;;;;;;;:::i;:::-;35511:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;;:31:::1;::::0;35536:5;35511:24:::1;:31::i;:::-;35488:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;:54;35565:29:::1;35580:13;:5:::0;:11:::1;:13::i;:::-;35565:10;::::0;::::1;::::0;:14:::1;;::::0;::::1;:29::i;:::-;35552:42;;:10;::::0;::::1;:42:::0;35620:33:::1;35638:14;:6:::0;:12:::1;:14::i;:::-;35620:13:::0;;:17:::1;;::::0;::::1;:33::i;:::-;35604:49;::::0;;::::1;::::0;;35663:13:::1;::::0;;::::1;35604;35663::::0;;;:6:::1;:13;::::0;;;;;;;:21;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;;35795:22;::::1;35791:660;;36085:9;36071:33;;;36112:6;36071:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;35791:660;;;36142:21;::::0;::::1;36158:4;36142:21;36138:313;;36389:51;:22;::::0;::::1;36412:4:::0;36426::::1;36433:6:::0;36389:22:::1;:51::i;:::-;36489:2;36465:42;;36483:4;36465:42;;36476:5;36465:42;;;36493:6;36501:5;36465:42;;;;;;;:::i;:::-;;;;;;;;36529:6;36517:18;;36556:5;36545:16;;31682:1;;;33738:2830:::0;;;;;;;;;:::o;14182:489::-;15204:5;;;;15190:10;:19;15182:64;;;;;;;;;;;;:::i;:::-;14316:6:::1;14312:353;;;14368:22;::::0;::::1;::::0;::::1;::::0;:34:::1;;;14394:8;14368:34;14360:68;;;;;;;;;;;;:::i;:::-;14492:5;::::0;;14471:37:::1;::::0;::::1;::::0;;::::1;::::0;14492:5;::::1;::::0;14471:37:::1;::::0;::::1;14522:5;:16:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;14552:25;;;;::::1;::::0;;14312:353:::1;;;14631:12;:23:::0;;;::::1;;::::0;::::1;;::::0;;14312:353:::1;14182:489:::0;;;:::o;40477:723::-;40635:4;31316:18;;;31324:10;31316:18;;;;:43;;-1:-1:-1;31338:21:0;;;31354:4;31338:21;;31316:43;31312:361;;;31467:10;31425:22;31450:28;;;:16;:28;;;;;;;;31500;31492:68;;;;;;;;;;;;:::i;:::-;31582:38;;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31574:88;;;;;;;;;;;;:::i;:::-;31312:361;;40695:1:::1;40677:3:::0;;40695:1;40677:6;::::1;;;;;;;;;;;;;;;;;:::i;:::-;:20;;;;40669:56;;;;;;;;;;;;:::i;:::-;40795:19;40838:3:::0;40795:19;40858:262:::1;40882:3;40878:1;:7;40858:262;;;40906:10;40919:3;;40923:1;40919:6;;;;;;;;;;;;;;;;;;;;:::i;:::-;40906:19;;40962:35;40987:6;;40994:1;40987:9;;;;;;;;;;;;;40962;:16;40972:5;40962:16;;;;;;;;;;;;;;;:20;40979:2;40962:20;;;;;;;;;;;;;;;;:24;;:35;;;;:::i;:::-;40939:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;:58;41025:26:::1;41041:6:::0;;41048:1;41041:9;;::::1;;;;;;;;;;;41025:11;:15;;:26;;;;:::i;:::-;41011:40;;41095:2;41070:39;;41089:4;41070:39;;41082:5;41070:39;;;41099:6;;41106:1;41099:9;;;;;;;;;;;;;41070:39;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;40887:3:0::1;;40858:262;;;-1:-1:-1::0;41154:16:0::1;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:39:::1;::::0;41181:11;41154:26:::1;:39::i;:::-;41129:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;;::::1;::::0;;;;;;;;;;:64;;;;-1:-1:-1;;;;;;;40477:723:0:o;18910:58::-;;;;;;;;;;;;;;;:::o;16611:1670::-;16743:20;16783:28;;;16775:73;;;;;;;;;;;;:::i;:::-;16880:23;;;;16974:1114;;;;17115:12;17140:4;;17130:15;;;;;;;:::i;:::-;;;;;;;;17115:30;;17325:4;17319:11;17361:66;17354:5;17347:81;17470:11;17463:4;17456:5;17452:16;17445:37;17524:66;17517:4;17510:5;17506:16;17499:92;17648:4;17642;17635:5;17632:1;17624:29;17608:45;;;17288:379;;;;17743:4;17737:11;17779:66;17772:5;17765:81;17888:11;17881:4;17874:5;17870:16;17863:37;17942:66;17935:4;17928:5;17924:16;17917:92;18059:4;18052:5;18049:1;18042:22;18026:38;;;17706:372;18097:30;;;;;;;;:16;:30;;;;;;;:47;;;;;;;;;;;;;;18155:58;;;;;:34;;18197:9;;18155:58;;18208:4;;;;18155:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18261:12;18229:45;;18239:14;18229:45;;;18255:4;;18229:45;;;;;;;:::i;:::-;;;;;;;;16611:1670;;;;;;;:::o;30290:44::-;;;;;;;;;;;;;;;:::o;20243:262::-;20292:7;20370:9;20416:25;20405:36;;:93;;20464:34;20490:7;20464:25;:34::i;:::-;20405:93;;;20444:17;20405:93;20398:100;;;20243:262;:::o;44672:370::-;15204:5;;;;15190:10;:19;15182:64;;;;;;;;;;;;:::i;:::-;29889:2:::1;44802:17;:42;;;;44794:87;;;;;;;;;;;;:::i;:::-;44911:19;::::0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;:56;;;::::1;::::0;::::1;::::0;::::1;;;::::0;;44982:53;::::1;::::0;::::1;::::0;44911:56;;44982:53:::1;:::i;:::-;;;;;;;;44672:370:::0;;:::o;14750:330::-;14817:12;;;;14866:10;:27;;14858:72;;;;;;;;;;;;:::i;:::-;14986:5;;;14965:42;;;;;;;14986:5;;;14965:42;;;15017:5;:21;;;;;;;;;;;;;;15048:25;;;;;;;14750:330::o;30244:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;30340:51::-;;;;;;;;;;;;;;;:::o;33003:195::-;33152:13;;;33117:14;33152:13;;;:6;:13;;;;;;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;33176:5;33183:7;33152:23;:39::i;:::-;33143:48;33003:195;-1:-1:-1;;;;33003:195:0:o;48241:2421::-;48358:24;;:::i;:::-;-1:-1:-1;48385:19:0;;;;;;;;:12;:19;;;;;;;;48358:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48436:15;;;48358:46;48436:15;;;;;;;48502:12;;48484:43;;;;;48358:46;;48436:15;;;;;;;48484:17;;:43;;48516:10;;48484:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48461:66;-1:-1:-1;48541:18:0;;:30;;;;;48564:7;48563:8;48541:30;48537:67;;;48587:7;;;;;48537:67;48637:13;;;48614:20;48637:13;;;:6;:13;;;;;:21;;;;48673:17;;48669:769;;;48728:13;48771:21;:12;48728:13;48771:16;:21::i;:::-;48756:36;;48830:20;:12;:18;:20::i;:::-;48806:13;;;;;;;:6;:13;;;;;;;:44;;;;;;;;;;;;;;;;48869:29;;;;;;48894:3;;48869:29;:::i;:::-;;;;;;;;48669:769;;;;48935:1;48919:13;:17;48915:523;;;49178:11;49200:14;;;49244:21;:12;49200:14;49244:16;:21::i;:::-;49229:36;;49303:20;:12;:18;:20::i;:::-;49279:13;;;;;;;:6;:13;;;;;:44;;;;;;;;;;;;;;;49352:29;49369:11;:3;:9;:11::i;:::-;49352:12;;;;:16;;;;:29::i;:::-;49337:44;;:12;;;;:44;;;;49400:27;;;;;;;;;49423:3;;49400:27;:::i;:::-;;;;;;;;48915:523;;49452:7;49448:1171;;;49475:21;49541:3;49499:39;49516:4;:21;;;49499:39;;:12;:16;;:39;;;;:::i;:::-;:45;;;;;;49475:69;;49652:13;49637:4;:12;;;:28;;;49633:976;;;49685:17;49705:31;49723:4;:12;;;49705:31;;:13;:17;;:31;;;;:::i;:::-;49685:51;-1:-1:-1;49758:20:0;;;;;:51;;;49794:15;49782:9;:27;49758:51;49754:125;;;-1:-1:-1;49845:15:0;49754:125;49896:49;:18;;;49923:9;49935;49896:18;:49::i;:::-;49978:35;49995:17;:9;:15;:17::i;:::-;49978:12;;;;:16;;;;:35::i;:::-;49963:50;;:12;;;;:50;;;;50031:25;;;;:14;;;;;;:25;;50046:9;;50031:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50097:5;50079:35;;;50104:9;50079:35;;;;;;:::i;:::-;;;;;;;;49633:976;;;;50154:13;50139:4;:12;;;:28;;;50135:474;;;50187:16;50206:39;50223:21;:13;:19;:21::i;:::-;50206:12;;;;:16;;;;:39::i;:::-;50187:58;;;-1:-1:-1;50267:20:0;;;;;:50;;;50302:15;50291:8;:26;50267:50;50263:123;;;-1:-1:-1;50352:15:0;50263:123;50429:28;;;;;50404:22;;50429:18;;;;;;:28;;50448:8;;50429:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50404:53;;50491:40;50508:22;:14;:20;:22::i;:::-;50491:12;;;;:16;;;;:40::i;:::-;50476:55;;:12;;;;:55;;;;50554:40;;;;;;;;;50579:14;;50554:40;:::i;:::-;;;;;;;;50135:474;;;49448:1171;;-1:-1:-1;;;50629:19:0;;;;;;;:12;:19;;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48241:2421;;;:::o;45843:1658::-;15204:5;;;;15190:10;:19;15182:64;;;;;;;;;;;;:::i;:::-;45928:24:::1;;:::i;:::-;-1:-1:-1::0;45955:19:0::1;::::0;;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;45928:46;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;;;::::0;;;;46004:22;;;:15:::1;:22:::0;;;;;;;46040;;45928:46;;46004:22:::1;::::0;46040:27:::1;::::0;;:53:::1;;;46082:11;46071:22;;:7;:22;;;;46040:53;46036:1423;;;46109:22;::::0;;::::1;;::::0;;;:15:::1;:22;::::0;;;;:36;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;46324:41:::1;46325:15;46324:39;:41::i;:::-;46299:66;;::::0;;46384:37:::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;46299:22:::1;::::0;46384:37:::1;46036:1423;;;46460:22:::0;;:27:::1;;::::0;;::::1;::::0;:72:::1;;-1:-1:-1::0;46510:22:0;;46491:41:::1;;:15;:41;;46460:72;46452:111;;;;;;;;;;;;:::i;:::-;46581:38;46589:15:::0;;::::1;46617:1;46589:15:::0;;;:8:::1;:15;::::0;;;;;::::1;46581:38:::0;46577:659:::1;;46662:15;::::0;;::::1;46639:20;46662:15:::0;;;:8:::1;:15;::::0;;;;;;46683:12;;::::1;::::0;46662:34;;;;;46639:20;;46662:15:::1;::::0;:20:::1;::::0;:34:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46639:57;;46761:1;46745:13;:17;46741:419;;;46844:13;::::0;::::1;46786:11;46844:13:::0;;;:6:::1;:13;::::0;;;;46808;;46844:29:::1;::::0;46808:13;46844:24:::1;:29::i;:::-;;46918:5;46900:29;;;46925:3;46900:29;;;;;;:::i;:::-;;;;;;;;46741:419;;;;46974:1;46958:13;:17;46954:206;;;47058:13;::::0;::::1;46999:11;47058:13:::0;;;:6:::1;:13;::::0;;;;47021:14;;;::::1;::::0;47058:29:::1;::::0;47021:14;47058:24:::1;:29::i;:::-;;47130:5;47114:27;;;47137:3;47114:27;;;;;;:::i;:::-;;;;;;;;46954:206;;47201:5;47183:38;;;47208:4;:12;;;47183:38;;;;;;:::i;:::-;;;;;;;;46577:659;;47249:15;::::0;;::::1;;::::0;;;:8:::1;:15;::::0;;;;;;;:25;;;;::::1;::::0;;;::::1;;::::0;;;47288:26;;;47328:12;;::::1;:16:::0;;;47358:22;;;:15:::1;:22:::0;;;;;;:37;;;;::::1;::::0;;;47414:34;;;::::1;::::0;::::1;::::0;47249:15;47414:34:::1;46036:1423;-1:-1:-1::0;47468:19:0::1;::::0;;;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;;:26;;;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;;::::1;;;::::0;;;-1:-1:-1;45843:1658:0:o;20864:343::-;15204:5;;;;15190:10;:19;15182:64;;;;;;;;;;;;:::i;:::-;20989:28:::1;::::0;::::1;20981:69;;;;;;;;;;;;:::i;:::-;21080:42;::::0;::::1;;::::0;;;:26:::1;:42;::::0;;;;;;:53;;;::::1;::::0;::::1;;;::::0;;21148:52;::::1;::::0;::::1;::::0;21080:53;;21148:52:::1;:::i;27063:269::-:0;27276:49;;;;;:12;;;;;;:49;;27289:4;;27295:2;;27299:6;;27307:8;;27317:1;;27320;;27323;;27276:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27063:269;;;;;;;;:::o;19031:41::-;;;;;;;;;;;;;:::o;13346:20::-;;;;;;:::o;18742:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36960:2114::-;37126:17;;37111:4;31316:18;;;31324:10;31316:18;;;;:43;;-1:-1:-1;31338:21:0;;;31354:4;31338:21;;31316:43;31312:361;;;31467:10;31425:22;31450:28;;;:16;:28;;;;;;;;31500;31492:68;;;;;;;;;;;;:::i;:::-;31582:38;;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31574:88;;;;;;;;;;;;:::i;:::-;31312:361;;37199:16:::1;::::0;::::1;37191:49;;;;;;;;;;;;:::i;:::-;37310:12;37325:22;::::0;::::1;::::0;:43:::1;;37362:6;37325:43;;;37350:9;37325:43;37310:58;;37378:19;;:::i;:::-;-1:-1:-1::0;37400:13:0::1;::::0;::::1;;::::0;;;:6:::1;:13;::::0;;;;;;;;37378:35;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;37427:10;37423:366:::1;;37597:26;:5:::0;37610:6;37618:4:::1;37597:12;:26::i;:::-;37589:34;;37423:366;;;37749:29;:5:::0;37765;37772::::1;37749:15;:29::i;:::-;37740:38;;37423:366;37824:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:33:::1;::::0;37851:5;37824:26:::1;:33::i;:::-;37799:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;:58;37883:33:::1;37901:14;:6:::0;:12:::1;:14::i;:::-;37883:13:::0;;:17:::1;;::::0;::::1;:33::i;:::-;37867:49;;::::0;;37939:29:::1;37954:13;:5:::0;:11:::1;:13::i;:::-;37939:10;::::0;::::1;::::0;:14:::1;;::::0;::::1;:29::i;:::-;37926:42;;:10;::::0;::::1;:42:::0;;;29953:4:::1;-1:-1:-1::0;38111:35:0::1;::::0;:54:::1;;-1:-1:-1::0;38150:10:0::1;::::0;::::1;::::0;:15:::1;;::::0;38111:54:::1;38103:89;;;;;;;;;;;;:::i;:::-;38202:13;::::0;;::::1;;::::0;;;:6:::1;:13;::::0;;;;;;;:21;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;38262:22;::::1;38258:698;;38414:42;::::0;;;;:34:::1;38428:9;38414:34;::::0;::::1;::::0;:42:::1;::::0;38449:6;;38414:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38589:12;38607:2;:7;;38622:6;38607:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38588:45;;;38655:7;38647:49;;;;;;;;;;;;:::i;:::-;38258:698;;;;38915:30;:18;::::0;::::1;38934:2:::0;38938:6;38915:18:::1;:30::i;:::-;38995:2;38970:43;;38989:4;38970:43;;38982:5;38970:43;;;38999:6;39007:5;38970:43;;;;;;;:::i;20635:139::-:0;20711:10;20680:28;;;;:16;:28;;;;;;:41;;;;;;;;20736:31;;;20680:28;20736:31;20635:139::o;16029:51::-;;;;;;;;;;;;;;;:::o;21964:2547::-;22180:28;;;22172:68;;;;;;;;;;;;:::i;:::-;22346:6;;:16;;;;-1:-1:-1;22356:6:0;;22346:16;:26;;;;-1:-1:-1;22366:6:0;;;;22346:26;22342:2003;;;22396:18;;;22404:10;22396:18;22388:58;;;;;;;;;;;;:::i;:::-;22468:36;:22;;;22502:1;22468:22;;;:16;:22;;;;;;;:36;22460:74;;;;;;;;;;;;:::i;:::-;22556:42;;;;;;;:26;:42;;;;;;;;22548:82;;;;;;;;;;;;:::i;:::-;22342:2003;;;22955:18;;;22947:59;;;;;;;;;;;;:::i;:::-;23449:14;23531:40;;;;;;;;;;;;;;;;;23593:18;:16;:18::i;:::-;19424:118;23761:8;:186;;23908:39;23761:186;;;23804:69;23761:186;24093:12;;;;;;;:6;:12;;;;;;;;;:14;;;;;;;;23668:465;;;;;;23977:4;;24011:14;;24055:8;;24093:14;23668:465;;:::i;:::-;;;;;;;;;;;;;23633:522;;;;;;23493:680;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23466:721;;;;;;23449:738;;24201:24;24228:26;24238:6;24246:1;24249;24252;24228:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24201:53;;24296:4;24276:24;;:16;:24;;;24268:66;;;;;;;;;;;;:::i;:::-;22342:2003;;;24374:38;;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;;;:55;;;;;;;;;;24444:60;;;;;24374:55;;24444:60;:::i;:::-;;;;;;;;21964:2547;;;;;;:::o;26156:521::-;26240:23;;26322:5;26311:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26311:24:0;-1:-1:-1;26299:36:0;-1:-1:-1;26367:5:0;26355:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26345:35;;26395:9;26390:281;26410:16;;;26390:281;;;26448:12;26462:19;26493:4;26512:5;;26518:1;26512:8;;;;;;;;;;;;;;;;;;:::i;:::-;26485:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26447:74;;;;26543:7;:24;;;;26555:12;26554:13;26543:24;26569:21;26583:6;26569:13;:21::i;:::-;26535:56;;;;;;;;;;;;;;:::i;:::-;;26620:7;26605:9;26615:1;26605:12;;;;;;;;;;;;;:22;;;;;;;;;;;26654:6;26641:7;26649:1;26641:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;26428:3:0;;26390:281;;;;26156:521;;;;;;:::o;32516:191::-;32663:13;;;32630;32663;;;:6;:13;;;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;32684:6;32692:7;32663:20;:37::i;30397:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13372:27::-;;;;;;:::o;41952:550::-;42128:11;29776:3;42142:26;:6;29707:2;42142:10;:26::i;:::-;:53;;;;;;;-1:-1:-1;42205:36:0;:18;;;42224:8;42234:6;42205:18;:36::i;:::-;42252:58;;;;;:20;;;;;;:58;;42273:10;;42285:5;;42292:6;;42300:3;;42305:4;;;;42252:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42355:37;42380:11;:3;:9;:11::i;:::-;42355:13;;;;;;;:6;:13;;;;;;:37;;:24;:37::i;:::-;42329:22;42345:5;42329:15;:22::i;:::-;:63;;42321:98;;;;;;;;;;;;:::i;:::-;42486:8;42434:61;;42466:5;42434:61;;42455:8;42434:61;;;42473:6;42481:3;42434:61;;;;;;;:::i;:::-;;;;;;;;41952:550;;;;;;;:::o;39576:459::-;39702:4;31316:18;;;31324:10;31316:18;;;;:43;;-1:-1:-1;31338:21:0;;;31354:4;31338:21;;31316:43;31312:361;;;31467:10;31425:22;31450:28;;;:16;:28;;;;;;;;31500;31492:68;;;;;;;;;;;;:::i;:::-;31582:38;;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31574:88;;;;;;;;;;;;:::i;:::-;31312:361;;39744:16:::1;::::0;::::1;39736:49;;;;;;;;;;;;:::i;:::-;39880:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:33:::1;::::0;39907:5;39880:26:::1;:33::i;:::-;39855:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;;:58;;;;39946:20;;::::1;::::0;;;;:31:::1;::::0;39971:5;39946:24:::1;:31::i;:::-;39923:16;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;;:54;;;;39993:35;;;::::1;::::0;::::1;::::0;::::1;::::0;40022:5;;39993:35:::1;:::i;:::-;;;;;;;;39576:459:::0;;;;;:::o;43397:932::-;43619:21;43657:6;43643:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43643:28:0;-1:-1:-1;43619:52:0;-1:-1:-1;43696:6:0;43682:11;43719:226;43743:3;43739:1;:7;43719:226;;;43767:14;43784:7;;43792:1;43784:10;;;;;;;;;;;;;43767:27;;29776:3;43818:26;29707:2;43818:6;:10;;:26;;;;:::i;:::-;:53;;;;;;43808:4;43813:1;43808:7;;;;;;;;;;;;;:63;;;;;43886:48;43909:9;;43919:1;43909:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;43923:7;;43931:1;43923:10;;;;;;;;;;;;;43886:6;;43893:1;43886:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22;;;:48;:22;:48::i;:::-;-1:-1:-1;43748:3:0;;43719:226;;;-1:-1:-1;43955:66:0;;;;;:25;;;;;;:66;;43981:10;;43993:6;;;;44001:7;;;;44010:4;;44016;;;;43955:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44037:9;44032:291;44056:3;44052:1;:7;44032:291;;;44080:12;44095:6;;44102:1;44095:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;44080:24;;44152:41;44177:15;:4;44182:1;44177:7;;;;;;;;;;;;;;:13;:15::i;:::-;44152:13;;;;;;;:6;:13;;;;;;:41;;:24;:41::i;:::-;44126:22;44142:5;44126:15;:22::i;:::-;:67;;44118:102;;;;;;;;;;;;:::i;:::-;44299:9;;44309:1;44299:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;44239:73;;44271:5;44239:73;;44260:8;44239:73;;;44278:7;;44286:1;44278:10;;;;;;;;;;;;;44290:4;44295:1;44290:7;;;;;;;;;;;;;;44239:73;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;44061:3:0;;44032:291;;30139:63;;;;;;;;;;;;;;;;;;;;;;;;:::o;9833:418::-;9982:13;;9954:12;;9982:18;;9978:267;;-1:-1:-1;10023:7:0;9978:267;;;10094:13;;10080:10;;;;10068:39;;;;;:23;;:7;;:23;:11;:23::i;:::-;:39;;;;;;10061:46;;10125:7;:57;;;;;10175:7;10162:5;:10;;;10136:36;;:23;10145:5;:13;;;10136:23;;:4;:8;;:23;;;;:::i;:::-;:36;;;;;;:46;10125:57;10121:114;;;10209:11;:4;10218:1;10209:8;:11::i;10121:114::-;9833:418;;;;;:::o;7713:158::-;7762:9;7791:16;;;;7783:57;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7862:1:0;7713:158::o;8320:139::-;8412:5;;;8407:16;;;;;;;;;8399:53;;;;;;;;;;;;:::i;:::-;8320:139;;;;:::o;10341:424::-;10462:15;10493:5;:10;;;:15;;10507:1;10493:15;10489:270;;;-1:-1:-1;10534:4:0;10489:270;;;10605:10;;;;10588:13;;10579:36;;;;;:23;;:4;;:23;:8;:23::i;:::-;:36;;;;;;10569:46;;10633:7;:57;;;;;10686:4;10670:5;:13;;;10644:39;;:23;10656:5;:10;;;10644:23;;:7;:11;;:23;;;;:::i;31951:167::-;32083:19;;;32013:14;32083:19;;;:12;:19;;;;;;:27;32048:30;;;;;32013:14;;32048:63;;32083:27;;;;;;;32048:15;;:30;;32072:4;;32048:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;:63::i;7412:136::-;7504:5;;;7499:16;;;;7491:50;;;;;;;;;;;;:::i;7267:139::-;7359:5;;;7354:16;;;;7346:53;;;;;;;;;;;;:::i;6605:374::-;6745:12;6759:17;6788:5;6780:19;;5636:10;6823:17;;6842:4;6848:2;6852:6;6800:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6780:80;;;;6800:59;6780:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6744:116;;;;6878:7;:57;;;;-1:-1:-1;6890:11:0;;:16;;:44;;;6921:4;6910:24;;;;;;;;;;;;:::i;:::-;6870:102;;;;;;;;;;;;:::i;:::-;6605:374;;;;;;:::o;19973:211::-;20047:7;19146:80;20127:24;20153:7;20170:4;20083:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20073:104;;;;;;20066:111;;19973:211;;;;:::o;8465:136::-;8557:5;;;8552:16;;;;;;;;;8544:50;;;;;;;;;;;;:::i;7554:153::-;7612:9;7641:6;;;:30;;-1:-1:-1;;7656:5:0;;;7670:1;7665;7656:5;7665:1;7651:15;;;;;:20;7641:30;7633:67;;;;;;;;;;;;:::i;5957:333::-;6071:12;6085:17;6114:5;6106:19;;5547:10;6149:12;;6163:2;6167:6;6126:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6106:69;;;;6126:48;6106:69;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6070:105;;;;6193:7;:57;;;;-1:-1:-1;6205:11:0;;:16;;:44;;;6236:4;6225:24;;;;;;;;;;;;:::i;:::-;6185:98;;;;;;;;;;;;:::i;:::-;5957:333;;;;;:::o;7877:153::-;7925:8;7953:15;;;;7945:55;;;;;;;;;;;;:::i;12576:177::-;12653:18;12712:34;12730:15;:7;:13;:15::i;:::-;12712:13;;;;;:17;:34::i;:::-;12696:50;;;;;;;;;;;;;;;-1:-1:-1;12696:50:0;;;-1:-1:-1;12576:177:0:o;12881:::-;12958:18;13017:34;13035:15;:7;:13;:15::i;:::-;13017:13;;;;;:17;:34::i;24840:487::-;24912:13;25073:2;25052:11;:18;:23;25048:67;;;-1:-1:-1;25077:38:0;;;;;;;;;;;;;;;;;;;25048:67;25215:4;25202:11;25198:22;25183:37;;25257:11;25246:33;;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;160:352::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;-1:-1;328:20;;368:18;357:30;;354:2;;;-1:-1;;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;434:4;;469:6;465:17;426:6;451:32;;448:41;445:2;;;502:1;;492:12;445:2;250:262;;;;;:::o;2101:336::-;;;2215:3;2208:4;2200:6;2196:17;2192:27;2182:2;;-1:-1;;2223:12;2182:2;-1:-1;2253:20;;2293:18;2282:30;;2279:2;;;-1:-1;;2315:12;2279:2;2359:4;2351:6;2347:17;2335:29;;2410:3;2359:4;2390:17;2351:6;2376:32;;2373:41;2370:2;;;2427:1;;2417:12;2636:156;2716:20;;2741:46;2716:20;2741:46;:::i;4154:126::-;4219:20;;66102:4;66091:16;;69362:33;;69352:2;;69409:1;;69399:12;4287:241;;4391:2;4379:9;4370:7;4366:23;4362:32;4359:2;;;-1:-1;;4397:12;4359:2;85:6;72:20;97:33;124:5;97:33;:::i;4535:366::-;;;4656:2;4644:9;4635:7;4631:23;4627:32;4624:2;;;-1:-1;;4662:12;4624:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4714:63;-1:-1;4814:2;4853:22;;72:20;97:33;72:20;97:33;:::i;:::-;4822:63;;;;4618:283;;;;;:::o;4908:859::-;;;;;;;5092:3;5080:9;5071:7;5067:23;5063:33;5060:2;;;-1:-1;;5099:12;5060:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5151:63;-1:-1;5251:2;5290:22;;72:20;97:33;72:20;97:33;:::i;:::-;5259:63;-1:-1;5359:2;5395:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;5367:60;-1:-1;5482:51;5525:7;5464:2;5501:22;;5482:51;:::i;:::-;5472:61;;5570:3;5614:9;5610:22;2017:20;5579:63;;5679:3;5723:9;5719:22;2017:20;5688:63;;5054:713;;;;;;;;:::o;5774:360::-;;;5892:2;5880:9;5871:7;5867:23;5863:32;5860:2;;;-1:-1;;5898:12;5860:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5950:63;-1:-1;6050:2;6086:22;;1748:20;1773:30;1748:20;1773:30;:::i;6141:479::-;;;;6273:2;6261:9;6252:7;6248:23;6244:32;6241:2;;;-1:-1;;6279:12;6241:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6331:63;-1:-1;6431:2;6467:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;6439:60;-1:-1;6536:2;6572:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;6544:60;;;;6235:385;;;;;:::o;6627:609::-;;;;;6781:2;6769:9;6760:7;6756:23;6752:32;6749:2;;;-1:-1;;6787:12;6749:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6839:63;-1:-1;6967:2;6952:18;;6939:32;6991:18;6980:30;;6977:2;;;-1:-1;;7013:12;6977:2;7051:64;7107:7;7098:6;7087:9;7083:22;7051:64;:::i;:::-;7033:82;;-1:-1;7033:82;-1:-1;;7152:2;7188:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;6743:493;;;;-1:-1;6743:493;;-1:-1;;6743:493::o;7243:538::-;;;;7407:2;7395:9;7386:7;7382:23;7378:32;7375:2;;;-1:-1;;7413:12;7375:2;7471:17;7458:31;7509:18;7501:6;7498:30;7495:2;;;-1:-1;;7531:12;7495:2;7569:91;7652:7;7643:6;7632:9;7628:22;7569:91;:::i;:::-;7551:109;;-1:-1;7551:109;-1:-1;;7697:2;7733:22;;1748:20;1773:30;1748:20;1773:30;:::i;7788:257::-;;7900:2;7888:9;7879:7;7875:23;7871:32;7868:2;;;-1:-1;;7906:12;7868:2;1896:6;1890:13;1908:30;1932:5;1908:30;:::i;8052:1415::-;;;;;;;;;;8388:3;8376:9;8367:7;8363:23;8359:33;8356:2;;;-1:-1;;8395:12;8356:2;2552:6;2539:20;2564:60;2618:5;2564:60;:::i;:::-;8447:90;-1:-1;8602:2;8587:18;;8574:32;8626:18;8615:30;;;8612:2;;;-1:-1;;8648:12;8612:2;8686:80;8758:7;8749:6;8738:9;8734:22;8686:80;:::i;:::-;8668:98;;-1:-1;8668:98;-1:-1;8831:2;8816:18;;8803:32;;-1:-1;8844:30;;;8841:2;;;-1:-1;;8877:12;8841:2;8915:93;9000:7;8991:6;8980:9;8976:22;8915:93;:::i;:::-;8897:111;;-1:-1;8897:111;-1:-1;9073:2;9058:18;;9045:32;;-1:-1;9086:30;;;9083:2;;;-1:-1;;9119:12;9083:2;9157:80;9229:7;9220:6;9209:9;9205:22;9157:80;:::i;:::-;9139:98;;-1:-1;9139:98;-1:-1;9302:3;9287:19;;9274:33;;-1:-1;9316:30;;;9313:2;;;-1:-1;;9349:12;9313:2;;9387:64;9443:7;9434:6;9423:9;9419:22;9387:64;:::i;:::-;9369:82;;;;;;;;;;8350:1117;;;;;;;;;;;:::o;9748:392::-;;;9882:2;9870:9;9861:7;9857:23;9853:32;9850:2;;;-1:-1;;9888:12;10147:643;;;;;10315:3;10303:9;10294:7;10290:23;10286:33;10283:2;;;-1:-1;;10322:12;10283:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;10374:76;-1:-1;10487:2;10526:22;;72:20;97:33;72:20;97:33;:::i;:::-;10495:63;-1:-1;10595:2;10634:22;;72:20;97:33;72:20;97:33;:::i;:::-;10277:513;;;;-1:-1;10603:63;;10703:2;10742:22;3808:20;;-1:-1;;10277:513::o;10797:769::-;;;;;;10982:3;10970:9;10961:7;10957:23;10953:33;10950:2;;;-1:-1;;10989:12;10950:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;11041:76;-1:-1;11154:2;11193:22;;72:20;97:33;72:20;97:33;:::i;:::-;11162:63;-1:-1;11262:2;11301:22;;72:20;97:33;72:20;97:33;:::i;:::-;10944:622;;;;-1:-1;11270:63;;11370:2;11409:22;;3808:20;;-1:-1;11478:3;11518:22;3808:20;;10944:622;-1:-1;;10944:622::o;11573:1143::-;;;;;;;;;11807:3;11795:9;11786:7;11782:23;11778:33;11775:2;;;-1:-1;;11814:12;11775:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;11866:76;-1:-1;11979:2;12018:22;;72:20;97:33;72:20;97:33;:::i;:::-;11987:63;-1:-1;12087:2;12126:22;;72:20;97:33;72:20;97:33;:::i;:::-;12095:63;-1:-1;12195:2;12234:22;;3808:20;;-1:-1;12303:3;12343:22;;3808:20;;-1:-1;12431:51;12474:7;12412:3;12450:22;;12431:51;:::i;:::-;12421:61;;12519:3;12563:9;12559:22;2017:20;12528:63;;12628:3;12672:9;12668:22;2017:20;12637:63;;11769:947;;;;;;;;;;;:::o;12723:955::-;;;;;;;12961:3;12949:9;12940:7;12936:23;12932:33;12929:2;;;-1:-1;;12968:12;12929:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;13020:76;-1:-1;13133:2;13172:22;;72:20;97:33;72:20;97:33;:::i;:::-;13141:63;-1:-1;13269:2;13254:18;;13241:32;13293:18;13282:30;;;13279:2;;;-1:-1;;13315:12;13279:2;13353:80;13425:7;13416:6;13405:9;13401:22;13353:80;:::i;:::-;13335:98;;-1:-1;13335:98;-1:-1;13498:2;13483:18;;13470:32;;-1:-1;13511:30;;;13508:2;;;-1:-1;;13544:12;13508:2;;13582:80;13654:7;13645:6;13634:9;13630:22;13582:80;:::i;:::-;12923:755;;;;-1:-1;12923:755;;-1:-1;12923:755;;13564:98;;12923:755;-1:-1;;;12923:755::o;13685:511::-;;;;13833:2;13821:9;13812:7;13808:23;13804:32;13801:2;;;-1:-1;;13839:12;13801:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;13891:76;-1:-1;14004:2;14040:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;13795:401;;14012:60;;-1:-1;;;14109:2;14148:22;;;;3808:20;;13795:401::o;14636:511::-;;;;14784:2;14772:9;14763:7;14759:23;14755:32;14752:2;;;-1:-1;;14790:12;14752:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;14842:76;-1:-1;14955:2;14994:22;;3808:20;;-1:-1;15063:2;15099:22;;1748:20;1773:30;1748:20;1773:30;:::i;15154:390::-;;;15287:2;15275:9;15266:7;15262:23;15258:32;15255:2;;;-1:-1;;15293:12;15255:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;15345:76;-1:-1;15458:2;15496:22;;4085:20;66000:18;65989:30;;69241:34;;69231:2;;-1:-1;;69279:12;15551:935;;;;;;;15776:3;15764:9;15755:7;15751:23;15747:33;15744:2;;;-1:-1;;15783:12;15744:2;2900:6;2887:20;2912:54;2960:5;2912:54;:::i;:::-;15835:84;-1:-1;15956:2;15995:22;;72:20;97:33;72:20;97:33;:::i;:::-;15964:63;-1:-1;16064:2;16116:22;;2716:20;2741:46;2716:20;2741:46;:::i;:::-;16072:76;-1:-1;16185:2;16224:22;;3808:20;;-1:-1;16321:3;16306:19;;16293:33;16346:18;16335:30;;16332:2;;;-1:-1;;16368:12;16332:2;16406:64;16462:7;16453:6;16442:9;16438:22;16406:64;:::i;16493:261::-;;16607:2;16595:9;16586:7;16582:23;16578:32;16575:2;;;-1:-1;;16613:12;16575:2;-1:-1;3226:13;;16569:185;-1:-1;16569:185::o;16761:362::-;;16886:2;16874:9;16865:7;16861:23;16857:32;16854:2;;;-1:-1;;16892:12;16854:2;16943:17;16937:24;16981:18;;16973:6;16970:30;16967:2;;;-1:-1;;17003:12;16967:2;17090:6;17079:9;17075:22;;;3402:3;3395:4;3387:6;3383:17;3379:27;3369:2;;-1:-1;;3410:12;3369:2;3450:6;3444:13;16981:18;61078:6;61075:30;61072:2;;;-1:-1;;61108:12;61072:2;60741;60735:9;16886:2;61181:9;3395:4;61166:6;61162:17;61158:33;60771:6;60767:17;;60878:6;60866:10;60863:22;16981:18;60830:10;60827:34;60824:62;60821:2;;;-1:-1;;60889:12;60821:2;60741;60908:22;3543:21;;;3643:16;;;16886:2;3643:16;3640:25;-1:-1;3637:2;;;-1:-1;;3668:12;3637:2;3688:39;3720:6;16886:2;3619:5;3615:16;16886:2;3585:6;3581:17;3688:39;:::i;:::-;17023:84;16848:275;-1:-1;;;;;;16848:275::o;17769:199::-;65794:42;65783:54;24020:63;;17957:4;17948:14;;17862:106::o;21395:690::-;;21588:5;61989:12;63196:6;63191:3;63184:19;63233:4;;63228:3;63224:14;21600:93;;63233:4;21764:5;61383:14;-1:-1;21803:260;21828:6;21825:1;21822:13;21803:260;;;21889:13;;22376:37;;18130:14;;;;62670;;;;21850:1;21843:9;21803:260;;;-1:-1;22069:10;;21519:566;-1:-1;;;;;21519:566::o;22607:297::-;;63196:6;63191:3;63184:19;67384:6;67379:3;63233:4;63228:3;63224:14;67361:30;-1:-1;63233:4;67431:6;63228:3;67422:16;;67415:27;63233:4;67898:7;67902:2;22890:6;67882:14;67878:28;63228:3;22859:39;;22852:46;;22707:197;;;;;:::o;23253:323::-;;23385:5;61989:12;63196:6;63191:3;63184:19;23468:52;23513:6;63233:4;63228:3;63224:14;63233:4;23494:5;23490:16;23468:52;:::i;:::-;67902:2;67882:14;67898:7;67878:28;23532:39;;;;63233:4;23532:39;;23333:243;-1:-1;;23333:243::o;36019:291::-;;67384:6;67379:3;67374;67361:30;67422:16;;67415:27;;;67422:16;36163:147;-1:-1;36163:147::o;36317:271::-;;23743:5;61989:12;23854:52;23899:6;23894:3;23887:4;23880:5;23876:16;23854:52;:::i;:::-;23918:16;;;;;36451:137;-1:-1;;36451:137::o;36595:553::-;;23743:5;61989:12;23854:52;23899:6;23894:3;23887:4;23880:5;23876:16;23854:52;:::i;:::-;23918:16;;;;22376:37;;;-1:-1;23887:4;37000:12;;22376:37;37111:12;;;36787:361;-1:-1;36787:361::o;37155:379::-;37519:10;37343:191::o;37541:222::-;65794:42;65783:54;;;;18378:37;;37668:2;37653:18;;37639:124::o;38015:1298::-;;38473:3;38462:9;38458:19;65794:42;64864:5;65783:54;18244:3;18237:58;38600:2;38473:3;38600:2;38589:9;38585:18;38578:48;38640:131;20287:86;20366:6;20361:3;20287:86;:::i;:::-;20280:93;;20471:21;;;-1:-1;20498:330;20523:6;20520:1;20517:13;20498:330;;;38600:2;20632:6;64757:12;20653:76;20725:3;64718:52;64757:12;20632:6;64718:52;:::i;:::-;20653:76;:::i;:::-;20736:85;;-1:-1;20646:83;-1:-1;20545:1;20538:9;20498:330;;;20502:14;38819:9;38813:4;38809:20;38804:2;38793:9;38789:18;38782:48;63196:6;63191:3;63184:19;21148:66;21140:6;21137:78;21134:2;;;-1:-1;;21218:12;21134:2;38600;21253:6;21249:17;21239:27;;67384:6;67379:3;38600:2;63228:3;63224:14;67361:30;67431:6;63228:3;67422:16;;;;38600:2;67422:16;;-1:-1;67422:16;67415:27;38600:2;39010:9;67422:16;39000:20;;38995:2;38984:9;38980:18;38973:48;39035:108;39138:4;39129:6;39035:108;:::i;:::-;39027:116;;;;39192:9;39186:4;39182:20;39176:3;39165:9;39161:19;39154:49;39217:86;39298:4;39289:6;39281;39217:86;:::i;:::-;39209:94;38444:869;-1:-1;;;;;;;;;;;38444:869::o;39320:814::-;;65794:42;;64864:5;65783:54;18244:3;18237:58;65794:42;64864:5;65783:54;39794:2;39783:9;39779:18;24020:63;;22406:5;39877:2;39866:9;39862:18;22376:37;22406:5;39960:2;39949:9;39945:18;22376:37;39608:3;39997;39986:9;39982:19;39975:49;40038:86;39608:3;39597:9;39593:19;40110:6;40102;40038:86;:::i;:::-;40030:94;39579:555;-1:-1;;;;;;;;39579:555::o;40141:444::-;65794:42;65783:54;;;18378:37;;65783:54;;;;40488:2;40473:18;;18378:37;40571:2;40556:18;;22376:37;;;;40324:2;40309:18;;40295:290::o;40592:884::-;65794:42;65783:54;;;18378:37;;65783:54;;;;41048:2;41033:18;;18378:37;41131:2;41116:18;;22376:37;;;;41214:2;41199:18;;22376:37;;;;66102:4;66091:16;41293:3;41278:19;;35972:35;41377:3;41362:19;;22376:37;41461:3;41446:19;;22376:37;;;;40883:3;40868:19;;40854:622::o;41483:333::-;65794:42;65783:54;;;;18378:37;;41802:2;41787:18;;22376:37;41638:2;41623:18;;41609:207::o;41823:653::-;42090:2;42104:47;;;61989:12;;42075:18;;;63184:19;;;41823:653;;63233:4;;63224:14;;;;61383;;;41823:653;18845:251;18870:6;18867:1;18864:13;18845:251;;;18931:13;;64948;64941:21;22148:34;;17542:14;;;;62670;;;;18892:1;18885:9;18845:251;;;18849:14;;;42315:9;42309:4;42305:20;63233:4;42289:9;42285:18;42278:48;42340:126;19373:5;61989:12;19392:95;19480:6;19475:3;19392:95;:::i;:::-;19385:102;;;;;63233:4;19544:6;19540:17;19535:3;19531:27;63233:4;19638:5;61383:14;-1:-1;19677:357;19702:6;19699:1;19696:13;19677:357;;;19764:9;19758:4;19754:20;19749:3;19742:33;17690:64;17750:3;19809:6;19803:13;17690:64;:::i;:::-;20013:14;;;;19823:90;-1:-1;62670:14;;;;18892:1;19717:9;19677:357;;;-1:-1;42332:134;;42061:415;-1:-1;;;;;;;;;42061:415::o;42483:210::-;64948:13;;64941:21;22148:34;;42604:2;42589:18;;42575:118::o;42700:222::-;22376:37;;;42827:2;42812:18;;42798:124::o;42929:768::-;22376:37;;;43355:2;43340:18;;22376:37;;;;65794:42;65783:54;;;43438:2;43423:18;;18378:37;65783:54;;43521:2;43506:18;;18378:37;64948:13;64941:21;43598:3;43583:19;;22148:34;43682:3;43667:19;;22376:37;43190:3;43175:19;;43161:536::o;43704:556::-;22376:37;;;44080:2;44065:18;;22376:37;;;;44163:2;44148:18;;22376:37;65794:42;65783:54;44246:2;44231:18;;18378:37;43915:3;43900:19;;43886:374::o;44267:548::-;22376:37;;;66102:4;66091:16;;;;44635:2;44620:18;;35972:35;44718:2;44703:18;;22376:37;44801:2;44786:18;;22376:37;44474:3;44459:19;;44445:370::o;44822:326::-;;44977:2;44998:17;44991:47;45052:86;44977:2;44966:9;44962:18;45124:6;45116;45052:86;:::i;45418:310::-;;45565:2;45586:17;45579:47;45640:78;45565:2;45554:9;45550:18;45704:6;45640:78;:::i;45735:416::-;45935:2;45949:47;;;25367:2;45920:18;;;63184:19;25403:23;63224:14;;;25383:44;25446:12;;;45906:245::o;46158:416::-;46358:2;46372:47;;;25697:2;46343:18;;;63184:19;25733:25;63224:14;;;25713:46;25778:12;;;46329:245::o;46581:416::-;46781:2;46795:47;;;26029:2;46766:18;;;63184:19;26065:30;63224:14;;;26045:51;26115:12;;;46752:245::o;47004:416::-;47204:2;47218:47;;;26366:2;47189:18;;;63184:19;26402:29;63224:14;;;26382:50;26451:12;;;47175:245::o;47427:416::-;47627:2;47641:47;;;26702:2;47612:18;;;63184:19;26738:30;63224:14;;;26718:51;26788:12;;;47598:245::o;47850:416::-;48050:2;48064:47;;;27039:2;48035:18;;;63184:19;27075:24;63224:14;;;27055:45;27119:12;;;48021:245::o;48273:416::-;48473:2;48487:47;;;27370:2;48458:18;;;63184:19;27406:23;63224:14;;;27386:44;27449:12;;;48444:245::o;48696:416::-;48896:2;48910:47;;;27700:2;48881:18;;;63184:19;27736:21;63224:14;;;27716:42;27777:12;;;48867:245::o;49119:416::-;49319:2;49333:47;;;28028:2;49304:18;;;63184:19;28064:30;63224:14;;;28044:51;28114:12;;;49290:245::o;49542:416::-;49742:2;49756:47;;;28365:2;49727:18;;;63184:19;28401:26;63224:14;;;28381:47;28447:12;;;49713:245::o;49965:416::-;50165:2;50179:47;;;28698:2;50150:18;;;63184:19;28734:25;63224:14;;;28714:46;28779:12;;;50136:245::o;50388:416::-;50588:2;50602:47;;;29030:2;50573:18;;;63184:19;29066:22;63224:14;;;29046:43;29108:12;;;50559:245::o;50811:416::-;51011:2;51025:47;;;29359:2;50996:18;;;63184:19;29395:28;63224:14;;;29375:49;29443:12;;;50982:245::o;51234:416::-;51434:2;51448:47;;;51419:18;;;63184:19;29730:34;63224:14;;;29710:55;29784:12;;;51405:245::o;51657:416::-;51857:2;51871:47;;;30035:2;51842:18;;;63184:19;30071:33;63224:14;;;30051:54;30124:12;;;51828:245::o;52080:416::-;52280:2;52294:47;;;52265:18;;;63184:19;30411:34;63224:14;;;30391:55;30465:12;;;52251:245::o;52503:416::-;52703:2;52717:47;;;30716:2;52688:18;;;63184:19;30752:29;63224:14;;;30732:50;30801:12;;;52674:245::o;52926:416::-;53126:2;53140:47;;;31052:2;53111:18;;;63184:19;31088:27;63224:14;;;31068:48;31135:12;;;53097:245::o;53349:416::-;53549:2;53563:47;;;31386:2;53534:18;;;63184:19;31422:31;63224:14;;;31402:52;31473:12;;;53520:245::o;53772:416::-;53972:2;53986:47;;;53957:18;;;63184:19;32065:34;63224:14;;;32045:55;32119:12;;;53943:245::o;54195:416::-;54395:2;54409:47;;;32370:2;54380:18;;;63184:19;32406:29;63224:14;;;32386:50;32455:12;;;54366:245::o;54618:416::-;54818:2;54832:47;;;32706:2;54803:18;;;63184:19;32742:29;63224:14;;;32722:50;32791:12;;;54789:245::o;55041:416::-;55241:2;55255:47;;;55226:18;;;63184:19;33078:34;63224:14;;;33058:55;33132:12;;;55212:245::o;55464:416::-;55664:2;55678:47;;;33383:2;55649:18;;;63184:19;33419:30;63224:14;;;33399:51;33469:12;;;55635:245::o;55887:416::-;56087:2;56101:47;;;33720:2;56072:18;;;63184:19;33756:24;63224:14;;;33736:45;33800:12;;;56058:245::o;56310:416::-;56510:2;56524:47;;;34051:2;56495:18;;;63184:19;34087:29;63224:14;;;34067:50;34136:12;;;56481:245::o;56733:416::-;56933:2;56947:47;;;34387:2;56918:18;;;63184:19;34423:31;63224:14;;;34403:52;34474:12;;;56904:245::o;57156:416::-;57356:2;57370:47;;;34725:2;57341:18;;;63184:19;34761:26;63224:14;;;34741:47;34807:12;;;57327:245::o;57579:416::-;57779:2;57793:47;;;57764:18;;;63184:19;35094:34;63224:14;;;35074:55;35148:12;;;57750:245::o;58002:222::-;65674:34;65663:46;;;;35365:50;;58129:2;58114:18;;58100:124::o;58231:349::-;65674:34;65663:46;;;;35365:50;;65794:42;65783:54;58566:2;58551:18;;18237:58;58394:2;58379:18;;58365:215::o;58587:333::-;65674:34;65663:46;;;35245:37;;65663:46;;58906:2;58891:18;;35245:37;58742:2;58727:18;;58713:207::o;59156:333::-;22376:37;;;59475:2;59460:18;;22376:37;59311:2;59296:18;;59282:207::o;59496:220::-;66000:18;65989:30;;;;35727:49;;59622:2;59607:18;;59593:123::o;59723:436::-;66000:18;65989:30;;;35857:36;;65989:30;;;;60062:2;60047:18;;35857:36;65674:34;65663:46;;;60145:2;60130:18;;35245:37;59902:2;59887:18;;59873:286::o;60166:506::-;;;60301:11;60288:25;60352:48;60376:8;60360:14;60356:29;60352:48;60332:18;60328:73;60318:2;;-1:-1;;60405:12;60318:2;60432:33;;60486:18;;;-1:-1;60524:18;60513:30;;60510:2;;;-1:-1;;60546:12;60510:2;60391:4;60574:13;;-1:-1;60360:14;60606:38;;;60596:49;;60593:2;;;60658:1;;60648:12;67457:268;67522:1;67529:101;67543:6;67540:1;67537:13;67529:101;;;67610:11;;;67604:18;67591:11;;;67584:39;67565:2;67558:10;67529:101;;;67645:6;67642:1;67639:13;67636:2;;;67522:1;67701:6;67696:3;67692:16;67685:27;67636:2;;67506:219;;;:::o;67919:117::-;65794:42;68006:5;65783:54;67981:5;67978:35;67968:2;;68027:1;;68017:12;67968:2;67962:74;:::o;68043:111::-;68124:5;64948:13;64941:21;68102:5;68099:32;68089:2;;68145:1;;68135:12"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "4566200",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "balanceOf(address,address)": "infinite",
                "batch(bytes[],bool)": "infinite",
                "batchFlashLoan(address,address[],address[],uint256[],bytes)": "infinite",
                "claimOwnership()": "45039",
                "deploy(address,bytes,bool)": "infinite",
                "deposit(address,address,address,uint256,uint256)": "infinite",
                "flashLoan(address,address,address,uint256,bytes)": "infinite",
                "harvest(address,bool,uint256)": "infinite",
                "masterContractApproved(address,address)": "infinite",
                "masterContractOf(address)": "1341",
                "nonces(address)": "1302",
                "owner()": "1136",
                "pendingOwner()": "1157",
                "pendingStrategy(address)": "1364",
                "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite",
                "registerProtocol()": "22240",
                "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "infinite",
                "setStrategy(address,address)": "infinite",
                "setStrategyTargetPercentage(address,uint64)": "23647",
                "strategy(address)": "1342",
                "strategyData(address)": "1447",
                "toAmount(address,uint256,bool)": "infinite",
                "toShare(address,uint256,bool)": "infinite",
                "totals(address)": "1386",
                "transfer(address,address,address,uint256)": "infinite",
                "transferMultiple(address,address,address[],uint256[])": "infinite",
                "transferOwnership(address,bool,bool)": "infinite",
                "whitelistMasterContract(address,bool)": "infinite",
                "whitelistedMasterContracts(address)": "1292",
                "withdraw(address,address,address,uint256,uint256)": "infinite"
              },
              "internal": {
                "_tokenBalanceOf(contract IERC20)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "balanceOf(address,address)": "f7888aec",
              "batch(bytes[],bool)": "d2423b51",
              "batchFlashLoan(address,address[],address[],uint256[],bytes)": "f483b3da",
              "claimOwnership()": "4e71e0c8",
              "deploy(address,bytes,bool)": "1f54245b",
              "deposit(address,address,address,uint256,uint256)": "02b9446c",
              "flashLoan(address,address,address,uint256,bytes)": "f1676d37",
              "harvest(address,bool,uint256)": "66c6bb0b",
              "masterContractApproved(address,address)": "91e0eab5",
              "masterContractOf(address)": "bafe4f14",
              "nonces(address)": "7ecebe00",
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978",
              "pendingStrategy(address)": "5108a558",
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "7c516e94",
              "registerProtocol()": "aee4d1b2",
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "c0a47c93",
              "setStrategy(address,address)": "72cb5d97",
              "setStrategyTargetPercentage(address,uint64)": "3e2a9d4e",
              "strategy(address)": "228bfd9f",
              "strategyData(address)": "df23b45b",
              "toAmount(address,uint256,bool)": "56623118",
              "toShare(address,uint256,bool)": "da5139ca",
              "totals(address)": "4ffe34db",
              "transfer(address,address,address,uint256)": "f18d03cc",
              "transferMultiple(address,address,address[],uint256[])": "0fca8843",
              "transferOwnership(address,bool,bool)": "078dfbe7",
              "whitelistMasterContract(address,bool)": "733a9d7c",
              "whitelistedMasterContracts(address)": "12a90c8a",
              "withdraw(address,address,address,uint256,uint256)": "97da6d30"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"wethToken_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"name\":\"LogDeploy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"borrower\",\"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\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"LogFlashLoan\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"protocol\",\"type\":\"address\"}],\"name\":\"LogRegisterProtocol\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogSetMasterContractApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyDivest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyInvest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyLoss\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyProfit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"LogStrategyQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"LogStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"targetPercentage\",\"type\":\"uint256\"}],\"name\":\"LogStrategyTargetPercentage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogWhiteListMasterContract\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"},{\"internalType\":\"bool\",\"name\":\"revertOnFail\",\"type\":\"bool\"}],\"name\":\"batch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IBatchFlashBorrower\",\"name\":\"borrower\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"receivers\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"batchFlashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"useCreate2\",\"type\":\"bool\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareOut\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IFlashBorrower\",\"name\":\"borrower\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"flashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"balance\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"maxChangeAmount\",\"type\":\"uint256\"}],\"name\":\"harvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractApproved\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingStrategy\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"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\":\"permitToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registerProtocol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setMasterContractApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"newStrategy\",\"type\":\"address\"}],\"name\":\"setStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"targetPercentage_\",\"type\":\"uint64\"}],\"name\":\"setStrategyTargetPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"strategy\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"strategyData\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"strategyStartDate\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"targetPercentage\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"roundUp\",\"type\":\"bool\"}],\"name\":\"toAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"roundUp\",\"type\":\"bool\"}],\"name\":\"toShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"totals\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"elastic\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"base\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tos\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shares\",\"type\":\"uint256[]\"}],\"name\":\"transferMultiple\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"whitelistMasterContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedMasterContracts\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareOut\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"author\":\"BoringCrypto, Keno\",\"kind\":\"dev\",\"methods\":{\"batch(bytes[],bool)\":{\"params\":{\"calls\":\"An array of inputs for each call.\",\"revertOnFail\":\"If True then reverts after a failed call and stops doing further calls.\"},\"returns\":{\"results\":\"An array with the returned data of each function call, mapped one-to-one to `calls`.\",\"successes\":\"An array indicating the success of a call, mapped one-to-one to `calls`.\"}},\"batchFlashLoan(address,address[],address[],uint256[],bytes)\":{\"params\":{\"amounts\":\"of the tokens for each receiver.\",\"borrower\":\"The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\",\"data\":\"The calldata to pass to the `borrower` contract.\",\"receivers\":\"An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\",\"tokens\":\"The addresses of the tokens.\"}},\"deploy(address,bytes,bool)\":{\"params\":{\"data\":\"Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\",\"masterContract\":\"The address of the contract to clone.\",\"useCreate2\":\"Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\"},\"returns\":{\"cloneAddress\":\"Address of the created clone contract.\"}},\"deposit(address,address,address,uint256,uint256)\":{\"params\":{\"amount\":\"Token amount in native representation to deposit.\",\"from\":\"which account to pull the tokens.\",\"share\":\"Token amount represented in shares to deposit. Takes precedence over `amount`.\",\"to\":\"which account to push the tokens.\",\"token_\":\"The ERC-20 token to deposit.\"},\"returns\":{\"amountOut\":\"The amount deposited.\",\"shareOut\":\"The deposited amount represented in shares.\"}},\"flashLoan(address,address,address,uint256,bytes)\":{\"params\":{\"amount\":\"of the tokens to receive.\",\"borrower\":\"The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\",\"data\":\"The calldata to pass to the `borrower` contract.\",\"receiver\":\"Address of the token receiver.\",\"token\":\"The address of the token to receive.\"}},\"harvest(address,bool,uint256)\":{\"params\":{\"balance\":\"True if housekeeping should be done.\",\"maxChangeAmount\":\"The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\",\"token\":\"The address of the token for which a strategy is deployed.\"}},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"params\":{\"approved\":\"If True approves access. If False revokes access.\",\"masterContract\":\"The address who gains or loses access.\",\"r\":\"Part of the signature. (See EIP-191)\",\"s\":\"Part of the signature. (See EIP-191)\",\"user\":\"The address of the user that approves or revokes access.\",\"v\":\"Part of the signature. (See EIP-191)\"}},\"setStrategy(address,address)\":{\"details\":\"Only the owner of this contract is allowed to change this.\",\"params\":{\"newStrategy\":\"The address of the contract that conforms to `IStrategy`.\",\"token\":\"The address of the token that maps to a strategy to change.\"}},\"setStrategyTargetPercentage(address,uint64)\":{\"details\":\"Only the owner of this contract is allowed to change this.\",\"params\":{\"targetPercentage_\":\"The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\",\"token\":\"The address of the token that maps to a strategy to change.\"}},\"toAmount(address,uint256,bool)\":{\"details\":\"Helper function represent shares back into the `token` amount.\",\"params\":{\"roundUp\":\"If the result should be rounded up.\",\"share\":\"The amount of shares.\",\"token\":\"The ERC-20 token.\"},\"returns\":{\"amount\":\"The share amount back into native representation.\"}},\"toShare(address,uint256,bool)\":{\"details\":\"Helper function to represent an `amount` of `token` in shares.\",\"params\":{\"amount\":\"The `token` amount.\",\"roundUp\":\"If the result `share` should be rounded up.\",\"token\":\"The ERC-20 token.\"},\"returns\":{\"share\":\"The token amount represented in shares.\"}},\"transfer(address,address,address,uint256)\":{\"params\":{\"from\":\"which user to pull the tokens.\",\"share\":\"The amount of `token` in shares.\",\"to\":\"which user to push the tokens.\",\"token\":\"The ERC-20 token to transfer.\"}},\"transferMultiple(address,address,address[],uint256[])\":{\"params\":{\"from\":\"which user to pull the tokens.\",\"shares\":\"The amount of `token` in shares for each receiver in `tos`.\",\"token\":\"The ERC-20 token to transfer.\",\"tos\":\"The receivers of the tokens.\"}},\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}},\"withdraw(address,address,address,uint256,uint256)\":{\"params\":{\"amount\":\"of tokens. Either one of `amount` or `share` needs to be supplied.\",\"from\":\"which user to pull the tokens.\",\"share\":\"Like above, but `share` takes precedence over `amount`.\",\"to\":\"which user to push the tokens.\",\"token_\":\"The ERC-20 token to withdraw.\"}}},\"title\":\"BentoBox\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batch(bytes[],bool)\":{\"notice\":\"Allows batched call to self (this contract).\"},\"batchFlashLoan(address,address[],address[],uint256[],bytes)\":{\"notice\":\"Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\"},\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"deploy(address,bytes,bool)\":{\"notice\":\"Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`.\"},\"deposit(address,address,address,uint256,uint256)\":{\"notice\":\"Deposit an amount of `token` represented in either `amount` or `share`.\"},\"flashLoan(address,address,address,uint256,bytes)\":{\"notice\":\"Flashloan ability.\"},\"harvest(address,bool,uint256)\":{\"notice\":\"The actual process of yield farming. Executes the strategy of `token`. Optionally does housekeeping if `balance` is true. `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\"},\"masterContractApproved(address,address)\":{\"notice\":\"masterContract to user to approval state\"},\"masterContractOf(address)\":{\"notice\":\"Mapping from clone contracts to their masterContract.\"},\"nonces(address)\":{\"notice\":\"user nonces for masterContract approvals\"},\"permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`.\"},\"registerProtocol()\":{\"notice\":\"Other contracts need to register with this master contract so that users can approve them for the BentoBox.\"},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"notice\":\"Approves or revokes a `masterContract` access to `user` funds.\"},\"setStrategy(address,address)\":{\"notice\":\"Sets the contract address of a new strategy that conforms to `IStrategy` for `token`. Must be called twice with the same arguments. A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\"},\"setStrategyTargetPercentage(address,uint64)\":{\"notice\":\"Sets the target percentage of the strategy for `token`.\"},\"transfer(address,address,address,uint256)\":{\"notice\":\"Transfer shares from a user account to another one.\"},\"transferMultiple(address,address,address[],uint256[])\":{\"notice\":\"Transfer shares from a user account to multiple other ones.\"},\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"},\"whitelistMasterContract(address,bool)\":{\"notice\":\"Enables or disables a contract for approval without signed message.\"},\"whitelistedMasterContracts(address)\":{\"notice\":\"masterContract to whitelisted state for approval without signed message\"},\"withdraw(address,address,address,uint256,uint256)\":{\"notice\":\"Withdraws an amount of `token` from a user account.\"}},\"notice\":\"The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies. Yield from this will go to the token depositors. Rebasing tokens ARE NOT supported and WILL cause loss of funds. Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BentoBoxV1\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 905,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 907,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              },
              {
                "astId": 1051,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "masterContractOf",
                "offset": 0,
                "slot": "2",
                "type": "t_mapping(t_address,t_address)"
              },
              {
                "astId": 1145,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "masterContractApproved",
                "offset": 0,
                "slot": "3",
                "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
              },
              {
                "astId": 1150,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "whitelistedMasterContracts",
                "offset": 0,
                "slot": "4",
                "type": "t_mapping(t_address,t_bool)"
              },
              {
                "astId": 1155,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "nonces",
                "offset": 0,
                "slot": "5",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1706,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "balanceOf",
                "offset": 0,
                "slot": "6",
                "type": "t_mapping(t_contract(IERC20)72,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1710,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "totals",
                "offset": 0,
                "slot": "7",
                "type": "t_mapping(t_contract(IERC20)72,t_struct(Rebase)555_storage)"
              },
              {
                "astId": 1714,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "strategy",
                "offset": 0,
                "slot": "8",
                "type": "t_mapping(t_contract(IERC20)72,t_contract(IStrategy)147)"
              },
              {
                "astId": 1718,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "pendingStrategy",
                "offset": 0,
                "slot": "9",
                "type": "t_mapping(t_contract(IERC20)72,t_contract(IStrategy)147)"
              },
              {
                "astId": 1722,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                "label": "strategyData",
                "offset": 0,
                "slot": "10",
                "type": "t_mapping(t_contract(IERC20)72,t_struct(StrategyData)1678_storage)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(IERC20)72": {
                "encoding": "inplace",
                "label": "contract IERC20",
                "numberOfBytes": "20"
              },
              "t_contract(IStrategy)147": {
                "encoding": "inplace",
                "label": "contract IStrategy",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_address,t_mapping(t_address,t_bool))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => bool))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_bool)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_contract(IERC20)72,t_contract(IStrategy)147)": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)72",
                "label": "mapping(contract IERC20 => contract IStrategy)",
                "numberOfBytes": "32",
                "value": "t_contract(IStrategy)147"
              },
              "t_mapping(t_contract(IERC20)72,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)72",
                "label": "mapping(contract IERC20 => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_contract(IERC20)72,t_struct(Rebase)555_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)72",
                "label": "mapping(contract IERC20 => struct Rebase)",
                "numberOfBytes": "32",
                "value": "t_struct(Rebase)555_storage"
              },
              "t_mapping(t_contract(IERC20)72,t_struct(StrategyData)1678_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)72",
                "label": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData)",
                "numberOfBytes": "32",
                "value": "t_struct(StrategyData)1678_storage"
              },
              "t_struct(Rebase)555_storage": {
                "encoding": "inplace",
                "label": "struct Rebase",
                "members": [
                  {
                    "astId": 552,
                    "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                    "label": "elastic",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 554,
                    "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                    "label": "base",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(StrategyData)1678_storage": {
                "encoding": "inplace",
                "label": "struct BentoBoxV1.StrategyData",
                "members": [
                  {
                    "astId": 1673,
                    "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                    "label": "strategyStartDate",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint64"
                  },
                  {
                    "astId": 1675,
                    "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                    "label": "targetPercentage",
                    "offset": 8,
                    "slot": "0",
                    "type": "t_uint64"
                  },
                  {
                    "astId": 1677,
                    "contract": "contracts/flat/BentoBoxV1Flat.sol:BentoBoxV1",
                    "label": "balance",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint64": {
                "encoding": "inplace",
                "label": "uint64",
                "numberOfBytes": "8"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "batch(bytes[],bool)": {
                "notice": "Allows batched call to self (this contract)."
              },
              "batchFlashLoan(address,address[],address[],uint256[],bytes)": {
                "notice": "Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction."
              },
              "claimOwnership()": {
                "notice": "Needs to be called by `pendingOwner` to claim ownership."
              },
              "deploy(address,bytes,bool)": {
                "notice": "Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`."
              },
              "deposit(address,address,address,uint256,uint256)": {
                "notice": "Deposit an amount of `token` represented in either `amount` or `share`."
              },
              "flashLoan(address,address,address,uint256,bytes)": {
                "notice": "Flashloan ability."
              },
              "harvest(address,bool,uint256)": {
                "notice": "The actual process of yield farming. Executes the strategy of `token`. Optionally does housekeeping if `balance` is true. `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true."
              },
              "masterContractApproved(address,address)": {
                "notice": "masterContract to user to approval state"
              },
              "masterContractOf(address)": {
                "notice": "Mapping from clone contracts to their masterContract."
              },
              "nonces(address)": {
                "notice": "user nonces for masterContract approvals"
              },
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`."
              },
              "registerProtocol()": {
                "notice": "Other contracts need to register with this master contract so that users can approve them for the BentoBox."
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "notice": "Approves or revokes a `masterContract` access to `user` funds."
              },
              "setStrategy(address,address)": {
                "notice": "Sets the contract address of a new strategy that conforms to `IStrategy` for `token`. Must be called twice with the same arguments. A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over."
              },
              "setStrategyTargetPercentage(address,uint64)": {
                "notice": "Sets the target percentage of the strategy for `token`."
              },
              "transfer(address,address,address,uint256)": {
                "notice": "Transfer shares from a user account to another one."
              },
              "transferMultiple(address,address,address[],uint256[])": {
                "notice": "Transfer shares from a user account to multiple other ones."
              },
              "transferOwnership(address,bool,bool)": {
                "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
              },
              "whitelistMasterContract(address,bool)": {
                "notice": "Enables or disables a contract for approval without signed message."
              },
              "whitelistedMasterContracts(address)": {
                "notice": "masterContract to whitelisted state for approval without signed message"
              },
              "withdraw(address,address,address,uint256,uint256)": {
                "notice": "Withdraws an amount of `token` from a user account."
              }
            },
            "notice": "The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies. Yield from this will go to the token depositors. Rebasing tokens ARE NOT supported and WILL cause loss of funds. Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.",
            "version": 1
          }
        },
        "BoringBatchable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes[]",
                  "name": "calls",
                  "type": "bytes[]"
                },
                {
                  "internalType": "bool",
                  "name": "revertOnFail",
                  "type": "bool"
                }
              ],
              "name": "batch",
              "outputs": [
                {
                  "internalType": "bool[]",
                  "name": "successes",
                  "type": "bool[]"
                },
                {
                  "internalType": "bytes[]",
                  "name": "results",
                  "type": "bytes[]"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "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": "permitToken",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "batch(bytes[],bool)": {
                "params": {
                  "calls": "An array of inputs for each call.",
                  "revertOnFail": "If True then reverts after a failed call and stops doing further calls."
                },
                "returns": {
                  "results": "An array with the returned data of each function call, mapped one-to-one to `calls`.",
                  "successes": "An array indicating the success of a call, mapped one-to-one to `calls`."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061074f806100206000396000f3fe6080604052600436106100295760003560e01c80637c516e941461002e578063d2423b5114610050575b600080fd5b34801561003a57600080fd5b5061004e6100493660046103b5565b61007a565b005b61006361005e366004610331565b610114565b60405161007192919061059d565b60405180910390f35b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063d505accf906100d8908a908a908a908a908a908a908a9060040161054f565b600060405180830381600087803b1580156100f257600080fd5b505af1158015610106573d6000803e3d6000fd5b505050505050505050505050565b6060808367ffffffffffffffff8111801561012e57600080fd5b50604051908082528060200260200182016040528015610158578160200160208202803683370190505b5091508367ffffffffffffffff8111801561017257600080fd5b506040519080825280602002602001820160405280156101a657816020015b60608152602001906001900390816101915790505b50905060005b848110156102c05760006060308888858181106101c557fe5b90506020028101906101d79190610651565b6040516101e592919061053f565b600060405180830381855af49150503d8060008114610220576040519150601f19603f3d011682016040523d82523d6000602084013e610225565b606091505b50915091508180610234575085155b61023d826102c9565b9061027e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102759190610637565b60405180910390fd5b508185848151811061028c57fe5b602002602001019015159081151581525050808484815181106102ab57fe5b602090810291909101015250506001016101ac565b50935093915050565b606060448251101561030f575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015261032c565b60048201915081806020019051810190610329919061043c565b90505b919050565b600080600060408486031215610345578283fd5b833567ffffffffffffffff8082111561035c578485fd5b818601915086601f83011261036f578485fd5b81358181111561037d578586fd5b8760208083028501011115610390578586fd5b6020928301955093505084013580151581146103aa578182fd5b809150509250925092565b600080600080600080600080610100898b0312156103d1578384fd5b88356103dc816106f4565b975060208901356103ec816106f4565b965060408901356103fc816106f4565b9550606089013594506080890135935060a089013560ff8116811461041f578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561044d578081fd5b815167ffffffffffffffff80821115610464578283fd5b818401915084601f830112610477578283fd5b815181811115610485578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011682010181811084821117156104c3578586fd5b6040528181528382016020018710156104da578485fd5b6104eb8260208301602087016106c4565b9695505050505050565b6000815180845261050d8160208601602086016106c4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b604080825283519082018190526000906020906060840190828701845b828110156105d85781511515845292840192908401906001016105ba565b505050838103828501528085516105ef81846106bb565b91508192508381028201848801865b838110156106285785830385526106168383516104f5565b948701949250908601906001016105fe565b50909998505050505050505050565b60006020825261064a60208301846104f5565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610685578283fd5b83018035915067ffffffffffffffff82111561069f578283fd5b6020019150368190038213156106b457600080fd5b9250929050565b90815260200190565b60005b838110156106df5781810151838201526020016106c7565b838111156106ee576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461071657600080fd5b5056fea26469706673582212206b6fab08d2acc36e165f3e247b0c9a24567a035b842906efd4d5a6dafaee531164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x74F DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x50 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B5 JUMP JUMPDEST PUSH2 0x7A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x63 PUSH2 0x5E CALLDATASIZE PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST PUSH2 0x114 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP3 SWAP2 SWAP1 PUSH2 0x59D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD505ACCF00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0xD8 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x54F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x106 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x12E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x158 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A6 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x191 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x1C5 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1D7 SWAP2 SWAP1 PUSH2 0x651 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E5 SWAP3 SWAP2 SWAP1 PUSH2 0x53F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x220 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x225 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x234 JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x23D DUP3 PUSH2 0x2C9 JUMP JUMPDEST SWAP1 PUSH2 0x27E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x275 SWAP2 SWAP1 PUSH2 0x637 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x28C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2AB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x1AC JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x30F JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x32C JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x329 SWAP2 SWAP1 PUSH2 0x43C JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x345 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x35C JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x36F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x37D JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x390 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3AA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x3D1 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x3DC DUP2 PUSH2 0x6F4 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x3EC DUP2 PUSH2 0x6F4 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x3FC DUP2 PUSH2 0x6F4 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x41F JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0xC0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xE0 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x464 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x477 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x485 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x4C3 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x4DA JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4EB DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x6C4 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x50D DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x6C4 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5D8 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5BA JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x5EF DUP2 DUP5 PUSH2 0x6BB JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x628 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x616 DUP4 DUP4 MLOAD PUSH2 0x4F5 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5FE JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x64A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4F5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x685 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x69F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x6B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6DF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x6C7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x716 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH12 0x6FAB08D2ACC36E165F3E247B 0xC SWAP11 0x24 JUMP PUSH27 0x35B842906EFD4D5A6DAFAEE531164736F6C634300060C00330000 ",
              "sourceMap": "26681:653:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052600436106100295760003560e01c80637c516e941461002e578063d2423b5114610050575b600080fd5b34801561003a57600080fd5b5061004e6100493660046103b5565b61007a565b005b61006361005e366004610331565b610114565b60405161007192919061059d565b60405180910390f35b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063d505accf906100d8908a908a908a908a908a908a908a9060040161054f565b600060405180830381600087803b1580156100f257600080fd5b505af1158015610106573d6000803e3d6000fd5b505050505050505050505050565b6060808367ffffffffffffffff8111801561012e57600080fd5b50604051908082528060200260200182016040528015610158578160200160208202803683370190505b5091508367ffffffffffffffff8111801561017257600080fd5b506040519080825280602002602001820160405280156101a657816020015b60608152602001906001900390816101915790505b50905060005b848110156102c05760006060308888858181106101c557fe5b90506020028101906101d79190610651565b6040516101e592919061053f565b600060405180830381855af49150503d8060008114610220576040519150601f19603f3d011682016040523d82523d6000602084013e610225565b606091505b50915091508180610234575085155b61023d826102c9565b9061027e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102759190610637565b60405180910390fd5b508185848151811061028c57fe5b602002602001019015159081151581525050808484815181106102ab57fe5b602090810291909101015250506001016101ac565b50935093915050565b606060448251101561030f575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015261032c565b60048201915081806020019051810190610329919061043c565b90505b919050565b600080600060408486031215610345578283fd5b833567ffffffffffffffff8082111561035c578485fd5b818601915086601f83011261036f578485fd5b81358181111561037d578586fd5b8760208083028501011115610390578586fd5b6020928301955093505084013580151581146103aa578182fd5b809150509250925092565b600080600080600080600080610100898b0312156103d1578384fd5b88356103dc816106f4565b975060208901356103ec816106f4565b965060408901356103fc816106f4565b9550606089013594506080890135935060a089013560ff8116811461041f578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561044d578081fd5b815167ffffffffffffffff80821115610464578283fd5b818401915084601f830112610477578283fd5b815181811115610485578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011682010181811084821117156104c3578586fd5b6040528181528382016020018710156104da578485fd5b6104eb8260208301602087016106c4565b9695505050505050565b6000815180845261050d8160208601602086016106c4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b604080825283519082018190526000906020906060840190828701845b828110156105d85781511515845292840192908401906001016105ba565b505050838103828501528085516105ef81846106bb565b91508192508381028201848801865b838110156106285785830385526106168383516104f5565b948701949250908601906001016105fe565b50909998505050505050505050565b60006020825261064a60208301846104f5565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610685578283fd5b83018035915067ffffffffffffffff82111561069f578283fd5b6020019150368190038213156106b457600080fd5b9250929050565b90815260200190565b60005b838110156106df5781810151838201526020016106c7565b838111156106ee576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461071657600080fd5b5056fea26469706673582212206b6fab08d2acc36e165f3e247b0c9a24567a035b842906efd4d5a6dafaee531164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x50 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B5 JUMP JUMPDEST PUSH2 0x7A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x63 PUSH2 0x5E CALLDATASIZE PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST PUSH2 0x114 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP3 SWAP2 SWAP1 PUSH2 0x59D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD505ACCF00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0xD8 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x54F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x106 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x12E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x158 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A6 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x191 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x1C5 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1D7 SWAP2 SWAP1 PUSH2 0x651 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E5 SWAP3 SWAP2 SWAP1 PUSH2 0x53F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x220 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x225 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x234 JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x23D DUP3 PUSH2 0x2C9 JUMP JUMPDEST SWAP1 PUSH2 0x27E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x275 SWAP2 SWAP1 PUSH2 0x637 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x28C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2AB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x1AC JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x30F JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x32C JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x329 SWAP2 SWAP1 PUSH2 0x43C JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x345 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x35C JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x36F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x37D JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x390 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3AA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x3D1 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x3DC DUP2 PUSH2 0x6F4 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x3EC DUP2 PUSH2 0x6F4 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x3FC DUP2 PUSH2 0x6F4 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x41F JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0xC0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xE0 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x464 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x477 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x485 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x4C3 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x4DA JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x4EB DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x6C4 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x50D DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x6C4 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5D8 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5BA JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x5EF DUP2 DUP5 PUSH2 0x6BB JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x628 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x616 DUP4 DUP4 MLOAD PUSH2 0x4F5 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5FE JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x64A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4F5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x685 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x69F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x6B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6DF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x6C7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x716 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH12 0x6FAB08D2ACC36E165F3E247B 0xC SWAP11 0x24 JUMP PUSH27 0x35B842906EFD4D5A6DAFAEE531164736F6C634300060C00330000 ",
              "sourceMap": "26681:653:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;27063:269;;;;;;;;;;-1:-1:-1;27063:269:0;;;;;:::i;:::-;;:::i;:::-;;26156:521;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27063:269;27276:49;;;;;:12;;;;;;:49;;27289:4;;27295:2;;27299:6;;27307:8;;27317:1;;27320;;27323;;27276:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27063:269;;;;;;;;:::o;26156:521::-;26240:23;;26322:5;26311:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26311:24:0;-1:-1:-1;26299:36:0;-1:-1:-1;26367:5:0;26355:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26345:35;;26395:9;26390:281;26410:16;;;26390:281;;;26448:12;26462:19;26493:4;26512:5;;26518:1;26512:8;;;;;;;;;;;;;;;;;;:::i;:::-;26485:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26447:74;;;;26543:7;:24;;;;26555:12;26554:13;26543:24;26569:21;26583:6;26569:13;:21::i;:::-;26535:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26620:7;26605:9;26615:1;26605:12;;;;;;;;;;;;;:22;;;;;;;;;;;26654:6;26641:7;26649:1;26641:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;26428:3:0;;26390:281;;;;26156:521;;;;;;:::o;24840:487::-;24912:13;25073:2;25052:11;:18;:23;25048:67;;;-1:-1:-1;25077:38:0;;;;;;;;;;;;;;;;;;;25048:67;25215:4;25202:11;25198:22;25183:37;;25257:11;25246:33;;;;;;;;;;;;:::i;:::-;25239:40;;24840:487;;;;:::o;1683:538:-1:-;;;;1847:2;1835:9;1826:7;1822:23;1818:32;1815:2;;;-1:-1;;1853:12;1815:2;1911:17;1898:31;1949:18;;1941:6;1938:30;1935:2;;;-1:-1;;1971:12;1935:2;2083:6;2072:9;2068:22;;;299:3;292:4;284:6;280:17;276:27;266:2;;-1:-1;;307:12;266:2;350:6;337:20;1949:18;369:6;366:30;363:2;;;-1:-1;;399:12;363:2;494:3;443:4;;478:6;474:17;435:6;460:32;;457:41;454:2;;;-1:-1;;501:12;454:2;443:4;431:17;;;;-1:-1;1991:109;-1:-1;;2173:22;;593:20;12779:13;;12772:21;14006:32;;13996:2;;-1:-1;;14042:12;13996:2;2145:60;;;;1809:412;;;;;:::o;2228:1143::-;;;;;;;;;2462:3;2450:9;2441:7;2437:23;2433:33;2430:2;;;-1:-1;;2469:12;2430:2;890:6;877:20;902:46;942:5;902:46;:::i;:::-;2521:76;-1:-1;2634:2;2673:22;;72:20;97:33;72:20;97:33;:::i;:::-;2642:63;-1:-1;2742:2;2781:22;;72:20;97:33;72:20;97:33;:::i;:::-;2750:63;-1:-1;2850:2;2889:22;;1480:20;;-1:-1;2958:3;2998:22;;1480:20;;-1:-1;3067:3;3105:22;;1615:20;13273:4;13262:16;;14523:33;;14513:2;;-1:-1;;14560:12;14513:2;2424:947;;;;-1:-1;2424:947;;;;;;3076:61;;-1:-1;;;3174:3;3214:22;;727:20;;3283:3;3323:22;727:20;;2424:947::o;3378:362::-;;3503:2;3491:9;3482:7;3478:23;3474:32;3471:2;;;-1:-1;;3509:12;3471:2;3560:17;3554:24;3598:18;;3590:6;3587:30;3584:2;;;-1:-1;;3620:12;3584:2;3707:6;3696:9;3692:22;;;1074:3;1067:4;1059:6;1055:17;1051:27;1041:2;;-1:-1;;1082:12;1041:2;1122:6;1116:13;3598:18;10447:6;10444:30;10441:2;;;-1:-1;;10477:12;10441:2;10110;10104:9;3503:2;10550:9;1067:4;10535:6;10531:17;10527:33;10140:6;10136:17;;10247:6;10235:10;10232:22;3598:18;10199:10;10196:34;10193:62;10190:2;;;-1:-1;;10258:12;10190:2;10110;10277:22;1215:21;;;1315:16;;;3503:2;1315:16;1312:25;-1:-1;1309:2;;;-1:-1;;1340:12;1309:2;1360:39;1392:6;3503:2;1291:5;1287:16;3503:2;1257:6;1253:17;1360:39;:::i;:::-;3640:84;3465:275;-1:-1;;;;;;3465:275::o;6451:323::-;;6583:5;11062:12;11877:6;11872:3;11865:19;6666:52;6711:6;11914:4;11909:3;11905:14;11914:4;6692:5;6688:16;6666:52;:::i;:::-;13809:2;13789:14;13805:7;13785:28;6730:39;;;;11914:4;6730:39;;6531:243;-1:-1;;6531:243::o;7369:291::-;;13372:6;13367:3;13362;13349:30;13410:16;;13403:27;;;13410:16;7513:147;-1:-1;7513:147::o;7667:884::-;13068:42;13057:54;;;4186:37;;13057:54;;;;8123:2;8108:18;;4186:37;8206:2;8191:18;;6061:37;;;;8289:2;8274:18;;6061:37;;;;13273:4;13262:16;8368:3;8353:19;;7322:35;8452:3;8437:19;;6061:37;8536:3;8521:19;;6061:37;;;;7958:3;7943:19;;7929:622::o;8558:653::-;8825:2;8839:47;;;11062:12;;8810:18;;;11865:19;;;8558:653;;11914:4;;11905:14;;;;10752;;;8558:653;4653:251;4678:6;4675:1;4672:13;4653:251;;;4739:13;;12779;12772:21;5944:34;;3889:14;;;;11599;;;;4700:1;4693:9;4653:251;;;4657:14;;;9050:9;9044:4;9040:20;11914:4;9024:9;9020:18;9013:48;9075:126;5181:5;11062:12;5200:95;5288:6;5283:3;5200:95;:::i;:::-;5193:102;;;;;11914:4;5352:6;5348:17;5343:3;5339:27;11914:4;5446:5;10752:14;-1:-1;5485:357;5510:6;5507:1;5504:13;5485:357;;;5572:9;5566:4;5562:20;5557:3;5550:33;4037:64;4097:3;5617:6;5611:13;4037:64;:::i;:::-;5821:14;;;;5631:90;-1:-1;11599:14;;;;4700:1;5525:9;5485:357;;;-1:-1;9067:134;;8796:415;-1:-1;;;;;;;;;8796:415::o;9218:310::-;;9365:2;9386:17;9379:47;9440:78;9365:2;9354:9;9350:18;9504:6;9440:78;:::i;:::-;9432:86;9336:192;-1:-1;;;9336:192::o;9535:506::-;;;9670:11;9657:25;9721:48;9745:8;9729:14;9725:29;9721:48;9701:18;9697:73;9687:2;;-1:-1;;9774:12;9687:2;9801:33;;9855:18;;;-1:-1;9893:18;9882:30;;9879:2;;;-1:-1;;9915:12;9879:2;9760:4;9943:13;;-1:-1;9729:14;9975:38;;;9965:49;;9962:2;;;10027:1;;10017:12;9962:2;9625:416;;;;;:::o;11750:175::-;11865:19;;;11914:4;11905:14;;11858:67::o;13445:268::-;13510:1;13517:101;13531:6;13528:1;13525:13;13517:101;;;13598:11;;;13592:18;13579:11;;;13572:39;13553:2;13546:10;13517:101;;;13633:6;13630:1;13627:13;13624:2;;;13510:1;13689:6;13684:3;13680:16;13673:27;13624:2;;13494:219;;;:::o;13826:117::-;13068:42;13913:5;13057:54;13888:5;13885:35;13875:2;;13934:1;;13924:12;13875:2;13869:74;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "374200",
                "executionCost": "411",
                "totalCost": "374611"
              },
              "external": {
                "batch(bytes[],bool)": "infinite",
                "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite"
              }
            },
            "methodIdentifiers": {
              "batch(bytes[],bool)": "d2423b51",
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "7c516e94"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"},{\"internalType\":\"bool\",\"name\":\"revertOnFail\",\"type\":\"bool\"}],\"name\":\"batch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"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\":\"permitToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batch(bytes[],bool)\":{\"params\":{\"calls\":\"An array of inputs for each call.\",\"revertOnFail\":\"If True then reverts after a failed call and stops doing further calls.\"},\"returns\":{\"results\":\"An array with the returned data of each function call, mapped one-to-one to `calls`.\",\"successes\":\"An array indicating the success of a call, mapped one-to-one to `calls`.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batch(bytes[],bool)\":{\"notice\":\"Allows batched call to self (this contract).\"},\"permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringBatchable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "batch(bytes[],bool)": {
                "notice": "Allows batched call to self (this contract)."
              },
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`."
              }
            },
            "version": 1
          }
        },
        "BoringERC20": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b7d2cf8a4b21de75b109c0fd707dd125bb89514e16d064ea44cc665ae36491ab64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB7 0xD2 0xCF DUP11 0x4B 0x21 0xDE PUSH22 0xB109C0FD707DD125BB89514E16D064EA44CC665AE364 SWAP2 0xAB PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "5287:1694:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b7d2cf8a4b21de75b109c0fd707dd125bb89514e16d064ea44cc665ae36491ab64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB7 0xD2 0xCF DUP11 0x4B 0x21 0xDE PUSH22 0xB109C0FD707DD125BB89514E16D064EA44CC665AE364 SWAP2 0xAB PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "5287:1694:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "safeTransfer(contract IERC20,address,uint256)": "infinite",
                "safeTransferFrom(contract IERC20,address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "BoringFactory": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "name": "LogDeploy",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "internalType": "bool",
                  "name": "useCreate2",
                  "type": "bool"
                }
              ],
              "name": "deploy",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "deploy(address,bytes,bool)": {
                "params": {
                  "data": "Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.",
                  "masterContract": "The address of the contract to clone.",
                  "useCreate2": "Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt."
                },
                "returns": {
                  "cloneAddress": "Address of the created clone contract."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506104dc806100206000396000f3fe6080604052600436106100295760003560e01c80631f54245b1461002e578063bafe4f1414610057575b600080fd5b61004161003c36600461035d565b610077565b60405161004e9190610403565b60405180910390f35b34801561006357600080fd5b5061004161007236600461033b565b6102e9565b600073ffffffffffffffffffffffffffffffffffffffff85166100cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c690610471565b60405180910390fd5b606085901b821561015857600085856040516100ec9291906103f3565b604051809103902090506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152816037826000f5935050506101b4565b6040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09250505b73ffffffffffffffffffffffffffffffffffffffff8281166000818152602081905260409081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938a169390931790925590517f4ddf47d4000000000000000000000000000000000000000000000000000000008152634ddf47d49034906102479089908990600401610424565b6000604051808303818588803b15801561026057600080fd5b505af1158015610274573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b87876040516102d8929190610424565b60405180910390a350949350505050565b60006020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b803573ffffffffffffffffffffffffffffffffffffffff8116811461033557600080fd5b92915050565b60006020828403121561034c578081fd5b6103568383610311565b9392505050565b60008060008060608587031215610372578283fd5b61037c8686610311565b9350602085013567ffffffffffffffff80821115610398578485fd5b818701915087601f8301126103ab578485fd5b8135818111156103b9578586fd5b8860208285010111156103ca578586fd5b602083019550809450505050604085013580151581146103e8578182fd5b939692955090935050565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e747261637460408201526060019056fea264697066735822122001c99921f713ebd39cc24a803677f358eebf90dedeefe17476f5e4c3741f275664736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4DC DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1F54245B EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x57 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41 PUSH2 0x3C CALLDATASIZE PUSH1 0x4 PUSH2 0x35D JUMP JUMPDEST PUSH2 0x77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x4E SWAP2 SWAP1 PUSH2 0x403 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x33B JUMP JUMPDEST PUSH2 0x2E9 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0xCF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC6 SWAP1 PUSH2 0x471 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x158 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0xEC SWAP3 SWAP2 SWAP1 PUSH2 0x3F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x4DDF47D400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x247 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x424 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x274 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x2D8 SWAP3 SWAP2 SWAP1 PUSH2 0x424 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x335 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x34C JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x356 DUP4 DUP4 PUSH2 0x311 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x372 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x37C DUP7 DUP7 PUSH2 0x311 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x398 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3AB JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x3B9 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x3CA JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3E8 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 PUSH1 0x20 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x40 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADD 0xC9 SWAP10 0x21 0xF7 SGT 0xEB 0xD3 SWAP13 0xC2 0x4A DUP1 CALLDATASIZE PUSH24 0xF358EEBF90DEDEEFE17476F5E4C3741F275664736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "15834:2449:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052600436106100295760003560e01c80631f54245b1461002e578063bafe4f1414610057575b600080fd5b61004161003c36600461035d565b610077565b60405161004e9190610403565b60405180910390f35b34801561006357600080fd5b5061004161007236600461033b565b6102e9565b600073ffffffffffffffffffffffffffffffffffffffff85166100cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c690610471565b60405180910390fd5b606085901b821561015857600085856040516100ec9291906103f3565b604051809103902090506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152816037826000f5935050506101b4565b6040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09250505b73ffffffffffffffffffffffffffffffffffffffff8281166000818152602081905260409081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938a169390931790925590517f4ddf47d4000000000000000000000000000000000000000000000000000000008152634ddf47d49034906102479089908990600401610424565b6000604051808303818588803b15801561026057600080fd5b505af1158015610274573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b87876040516102d8929190610424565b60405180910390a350949350505050565b60006020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b803573ffffffffffffffffffffffffffffffffffffffff8116811461033557600080fd5b92915050565b60006020828403121561034c578081fd5b6103568383610311565b9392505050565b60008060008060608587031215610372578283fd5b61037c8686610311565b9350602085013567ffffffffffffffff80821115610398578485fd5b818701915087601f8301126103ab578485fd5b8135818111156103b9578586fd5b8860208285010111156103ca578586fd5b602083019550809450505050604085013580151581146103e8578182fd5b939692955090935050565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e747261637460408201526060019056fea264697066735822122001c99921f713ebd39cc24a803677f358eebf90dedeefe17476f5e4c3741f275664736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1F54245B EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x57 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41 PUSH2 0x3C CALLDATASIZE PUSH1 0x4 PUSH2 0x35D JUMP JUMPDEST PUSH2 0x77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x4E SWAP2 SWAP1 PUSH2 0x403 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x33B JUMP JUMPDEST PUSH2 0x2E9 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0xCF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC6 SWAP1 PUSH2 0x471 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x158 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0xEC SWAP3 SWAP2 SWAP1 PUSH2 0x3F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x4DDF47D400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x247 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x424 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x274 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x2D8 SWAP3 SWAP2 SWAP1 PUSH2 0x424 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x335 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x34C JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x356 DUP4 DUP4 PUSH2 0x311 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x372 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x37C DUP7 DUP7 PUSH2 0x311 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x398 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3AB JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x3B9 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x3CA JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3E8 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 PUSH1 0x20 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x40 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADD 0xC9 SWAP10 0x21 0xF7 SGT 0xEB 0xD3 SWAP13 0xC2 0x4A DUP1 CALLDATASIZE PUSH24 0xF358EEBF90DEDEEFE17476F5E4C3741F275664736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "15834:2449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;16611:1670;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16029:51;;;;;;;;;;-1:-1:-1;16029:51:0;;;;;:::i;:::-;;:::i;16611:1670::-;16743:20;16783:28;;;16775:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16880:23;;;;16974:1114;;;;17115:12;17140:4;;17130:15;;;;;;;:::i;:::-;;;;;;;;17115:30;;17325:4;17319:11;17361:66;17354:5;17347:81;17470:11;17463:4;17456:5;17452:16;17445:37;17524:66;17517:4;17510:5;17506:16;17499:92;17648:4;17642;17635:5;17632:1;17624:29;17608:45;;;17288:379;;;;17743:4;17737:11;17779:66;17772:5;17765:81;17888:11;17881:4;17874:5;17870:16;17863:37;17942:66;17935:4;17928:5;17924:16;17917:92;18059:4;18052:5;18049:1;18042:22;18026:38;;;17706:372;18097:30;;;;:16;:30;;;;;;;;;;;;:47;;;;;;;;;;;;;;18155:58;;;;;:34;;18197:9;;18155:58;;18208:4;;;;18155:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18261:12;18229:45;;18239:14;18229:45;;;18255:4;;18229:45;;;;;;;:::i;:::-;;;;;;;;16611:1670;;;;;;;:::o;16029:51::-;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;4667:42;4656:54;;5040:35;;5030:2;;5089:1;;5079:12;5030:2;57:78;;;;:::o;631:241::-;;735:2;723:9;714:7;710:23;706:32;703:2;;;-1:-1;;741:12;703:2;803:53;848:7;824:22;803:53;:::i;:::-;793:63;697:175;-1:-1;;;697:175::o;879:609::-;;;;;1033:2;1021:9;1012:7;1008:23;1004:32;1001:2;;;-1:-1;;1039:12;1001:2;1101:53;1146:7;1122:22;1101:53;:::i;:::-;1091:63;;1219:2;1208:9;1204:18;1191:32;1243:18;;1235:6;1232:30;1229:2;;;-1:-1;;1265:12;1229:2;1350:6;1339:9;1335:22;;;401:3;394:4;386:6;382:17;378:27;368:2;;-1:-1;;409:12;368:2;452:6;439:20;1243:18;471:6;468:30;465:2;;;-1:-1;;501:12;465:2;596:3;1219:2;576:17;537:6;562:32;;559:41;556:2;;;-1:-1;;603:12;556:2;1219;537:6;533:17;1285:82;;;;;;;;1404:2;1444:9;1440:22;206:20;5186:5;4568:13;4561:21;5164:5;5161:32;5151:2;;-1:-1;;5197:12;5151:2;995:493;;;;-1:-1;995:493;;-1:-1;;995:493::o;2625:291::-;;4804:6;4799:3;4794;4781:30;4842:16;;4835:27;;;4842:16;2769:147;-1:-1;2769:147::o;2923:222::-;4667:42;4656:54;;;;1566:37;;3050:2;3035:18;;3021:124::o;3152:326::-;;3307:2;3328:17;3321:47;4023:6;3307:2;3296:9;3292:18;4011:19;4804:6;4799:3;4051:14;3296:9;4051:14;4781:30;4842:16;;;4051:14;4842:16;;;4835:27;;;;4964:2;4944:14;;;4960:7;4940:28;1890:39;;;3278:200;-1:-1;3278:200::o;3485:416::-;3685:2;3699:47;;;3670:18;;;4011:19;2545:34;4051:14;;;2525:55;2599:12;;;3656:245::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "248800",
                "executionCost": "287",
                "totalCost": "249087"
              },
              "external": {
                "deploy(address,bytes,bool)": "infinite",
                "masterContractOf(address)": "1266"
              }
            },
            "methodIdentifiers": {
              "deploy(address,bytes,bool)": "1f54245b",
              "masterContractOf(address)": "bafe4f14"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"name\":\"LogDeploy\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"useCreate2\",\"type\":\"bool\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,bool)\":{\"params\":{\"data\":\"Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\",\"masterContract\":\"The address of the contract to clone.\",\"useCreate2\":\"Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\"},\"returns\":{\"cloneAddress\":\"Address of the created clone contract.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deploy(address,bytes,bool)\":{\"notice\":\"Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`.\"},\"masterContractOf(address)\":{\"notice\":\"Mapping from clone contracts to their masterContract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1051,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BoringFactory",
                "label": "masterContractOf",
                "offset": 0,
                "slot": "0",
                "type": "t_mapping(t_address,t_address)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "deploy(address,bytes,bool)": {
                "notice": "Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`."
              },
              "masterContractOf(address)": {
                "notice": "Mapping from clone contracts to their masterContract."
              }
            },
            "version": 1
          }
        },
        "BoringMath": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bba520dedff3652e584b14bab94651824665d31a4340aea7e2f7d24f140c515164736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBB 0xA5 KECCAK256 0xDE 0xDF RETURN PUSH6 0x2E584B14BAB9 CHAINID MLOAD DUP3 CHAINID PUSH6 0xD31A4340AEA7 0xE2 0xF7 0xD2 0x4F EQ 0xC MLOAD MLOAD PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "7242:949:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bba520dedff3652e584b14bab94651824665d31a4340aea7e2f7d24f140c515164736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBB 0xA5 KECCAK256 0xDE 0xDF RETURN PUSH6 0x2E584B14BAB9 CHAINID MLOAD DUP3 CHAINID PUSH6 0xD31A4340AEA7 0xE2 0xF7 0xD2 0x4F EQ 0xC MLOAD MLOAD PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "7242:949:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint256,uint256)": "infinite",
                "mul(uint256,uint256)": "infinite",
                "sub(uint256,uint256)": "infinite",
                "to128(uint256)": "infinite",
                "to32(uint256)": "infinite",
                "to64(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringMath\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).",
            "version": 1
          }
        },
        "BoringMath128": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220dc92e7b43fdb62f52c3d89353a19e9060d719c8c2cc7a792a83600480d3d505664736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDC SWAP3 0xE7 0xB4 EXTCODEHASH 0xDB PUSH3 0xF52C3D DUP10 CALLDATALOAD GASPRICE NOT 0xE9 MOD 0xD PUSH18 0x9C8C2CC7A792A83600480D3D505664736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "8292:311:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220dc92e7b43fdb62f52c3d89353a19e9060d719c8c2cc7a792a83600480d3d505664736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDC SWAP3 0xE7 0xB4 EXTCODEHASH 0xDB PUSH3 0xF52C3D DUP10 CALLDATALOAD GASPRICE NOT 0xE9 MOD 0xD PUSH18 0x9C8C2CC7A792A83600480D3D505664736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "8292:311:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint128,uint128)": "infinite",
                "sub(uint128,uint128)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe addition and subtraction on uint128.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringMath128\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe addition and subtraction on uint128.",
            "version": 1
          }
        },
        "BoringMath32": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c19d849c795275c81374b1e3bb97faec0e6c37bd5edfc7d154ab6c1a8c77440564736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC1 SWAP14 DUP5 SWAP13 PUSH26 0x5275C81374B1E3BB97FAEC0E6C37BD5EDFC7D154AB6C1A8C7744 SDIV PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "9107:304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c19d849c795275c81374b1e3bb97faec0e6c37bd5edfc7d154ab6c1a8c77440564736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC1 SWAP14 DUP5 SWAP13 PUSH26 0x5275C81374B1E3BB97FAEC0E6C37BD5EDFC7D154AB6C1A8C7744 SDIV PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "9107:304:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint32,uint32)": "infinite",
                "sub(uint32,uint32)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe addition and subtraction on uint32.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringMath32\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe addition and subtraction on uint32.",
            "version": 1
          }
        },
        "BoringMath64": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220216926394a4527ebd277a7200dadbf1c5f35b77aa568f3ee4a29b3b3fa87135364736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x21 PUSH10 0x26394A4527EBD277A720 0xD 0xAD 0xBF SHR 0x5F CALLDATALOAD 0xB7 PUSH27 0xA568F3EE4A29B3B3FA87135364736F6C634300060C003300000000 ",
              "sourceMap": "8703:304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220216926394a4527ebd277a7200dadbf1c5f35b77aa568f3ee4a29b3b3fa87135364736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x21 PUSH10 0x26394A4527EBD277A720 0xD 0xAD 0xBF SHR 0x5F CALLDATALOAD 0xB7 PUSH27 0xA568F3EE4A29B3B3FA87135364736F6C634300060C003300000000 ",
              "sourceMap": "8703:304:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint64,uint64)": "infinite",
                "sub(uint64,uint64)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe addition and subtraction on uint64.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringMath64\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe addition and subtraction on uint64.",
            "version": 1
          }
        },
        "BoringOwnable": {
          "abi": [
            {
              "inputs": [],
              "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"
            },
            {
              "inputs": [],
              "name": "claimOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "direct",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "renounce",
                  "type": "bool"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "transferOwnership(address,bool,bool)": {
                "params": {
                  "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
                  "newOwner": "Address of the new owner.",
                  "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36104b18061005f6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063078dfbe7146100515780634e71e0c8146100665780638da5cb5b1461006e578063e30c39781461008c575b600080fd5b61006461005f366004610346565b610094565b005b610064610228565b61007661030e565b60405161008391906103a8565b60405180910390f35b61007661032a565b60005473ffffffffffffffffffffffffffffffffffffffff1633146100ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e590610400565b60405180910390fd5b81156101e25773ffffffffffffffffffffffffffffffffffffffff83161515806101155750805b61014b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e5906103c9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600180549091169055610223565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633811461027a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e590610435565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006060848603121561035a578283fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461037d578384fd5b9250602084013561038d8161046a565b9150604084013561039d8161046a565b809150509250925092565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b801515811461047857600080fd5b5056fea2646970667358221220096fe99920f407a96a72bbd25a2d8e685a07f159f383fb62e6e83d03a9672e7064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 PUSH2 0x4B1 DUP1 PUSH2 0x5F PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x8C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x346 JUMP JUMPDEST PUSH2 0x94 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH2 0x228 JUMP JUMPDEST PUSH2 0x76 PUSH2 0x30E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x3A8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x32A JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xEE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE5 SWAP1 PUSH2 0x400 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x1E2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x115 JUMPI POP DUP1 JUMPDEST PUSH2 0x14B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE5 SWAP1 PUSH2 0x3C9 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x223 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x27A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE5 SWAP1 PUSH2 0x435 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x35A JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x37D JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x38D DUP2 PUSH2 0x46A JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x39D DUP2 PUSH2 0x46A JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A207A65726F20616464726573730000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x478 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MULMOD PUSH16 0xE99920F407A96A72BBD25A2D8E685A07 CALL MSIZE RETURN DUP4 0xFB PUSH3 0xE6E83D SUB 0xA9 PUSH8 0x2E7064736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "13404:1862:0:-:0;;;13608:115;;;;;;;;;-1:-1:-1;13639:5:0;:18;;-1:-1:-1;;;;;;13639:18:0;13647:10;13639:18;;;;;13672:44;;13647:10;;13639:5;13672:44;;13639:5;;13672:44;13404:1862;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061004c5760003560e01c8063078dfbe7146100515780634e71e0c8146100665780638da5cb5b1461006e578063e30c39781461008c575b600080fd5b61006461005f366004610346565b610094565b005b610064610228565b61007661030e565b60405161008391906103a8565b60405180910390f35b61007661032a565b60005473ffffffffffffffffffffffffffffffffffffffff1633146100ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e590610400565b60405180910390fd5b81156101e25773ffffffffffffffffffffffffffffffffffffffff83161515806101155750805b61014b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e5906103c9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600180549091169055610223565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633811461027a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e590610435565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006060848603121561035a578283fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461037d578384fd5b9250602084013561038d8161046a565b9150604084013561039d8161046a565b809150509250925092565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b801515811461047857600080fd5b5056fea2646970667358221220096fe99920f407a96a72bbd25a2d8e685a07f159f383fb62e6e83d03a9672e7064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x8C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x346 JUMP JUMPDEST PUSH2 0x94 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH2 0x228 JUMP JUMPDEST PUSH2 0x76 PUSH2 0x30E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x3A8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x32A JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xEE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE5 SWAP1 PUSH2 0x400 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x1E2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x115 JUMPI POP DUP1 JUMPDEST PUSH2 0x14B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE5 SWAP1 PUSH2 0x3C9 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x223 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x27A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xE5 SWAP1 PUSH2 0x435 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x35A JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x37D JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x38D DUP2 PUSH2 0x46A JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x39D DUP2 PUSH2 0x46A JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A207A65726F20616464726573730000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x478 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MULMOD PUSH16 0xE99920F407A96A72BBD25A2D8E685A07 CALL MSIZE RETURN DUP4 0xFB PUSH3 0xE6E83D SUB 0xA9 PUSH8 0x2E7064736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "13404:1862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14182:489;;;;;;:::i;:::-;;:::i;:::-;;14750:330;;;:::i;13346:20::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13372:27;;;:::i;14182:489::-;15204:5;;;;15190:10;:19;15182:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14316:6:::1;14312:353;;;14368:22;::::0;::::1;::::0;::::1;::::0;:34:::1;;;14394:8;14368:34;14360:68;;;;;;;;;;;;:::i;:::-;14492:5;::::0;;14471:37:::1;::::0;::::1;::::0;;::::1;::::0;14492:5;::::1;::::0;14471:37:::1;::::0;::::1;14522:5;:16:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;14552:25;;;;::::1;::::0;;14312:353:::1;;;14631:12;:23:::0;;;::::1;;::::0;::::1;;::::0;;14312:353:::1;14182:489:::0;;;:::o;14750:330::-;14817:12;;;;14866:10;:27;;14858:72;;;;;;;;;;;;:::i;:::-;14986:5;;;14965:42;;;;;;;14986:5;;;14965:42;;;15017:5;:21;;;;;;;;;;;;;;15048:25;;;;;;;14750:330::o;13346:20::-;;;;;;:::o;13372:27::-;;;;;;:::o;273:479:-1:-;;;;405:2;393:9;384:7;380:23;376:32;373:2;;;-1:-1;;411:12;373:2;85:6;72:20;3824:42;3966:5;3813:54;3941:5;3938:35;3928:2;;-1:-1;;3977:12;3928:2;463:63;-1:-1;563:2;599:22;;206:20;231:30;206:20;231:30;:::i;:::-;571:60;-1:-1;668:2;704:22;;206:20;231:30;206:20;231:30;:::i;:::-;676:60;;;;367:385;;;;;:::o;1891:222::-;3824:42;3813:54;;;;830:37;;2018:2;2003:18;;1989:124::o;2120:416::-;2320:2;2334:47;;;1104:2;2305:18;;;3493:19;1140:23;3533:14;;;1120:44;1183:12;;;2291:245::o;2543:416::-;2743:2;2757:47;;;2728:18;;;3493:19;1470:34;3533:14;;;1450:55;1524:12;;;2714:245::o;2966:416::-;3166:2;3180:47;;;3151:18;;;3493:19;1811:34;3533:14;;;1791:55;1865:12;;;3137:245::o;4003:111::-;4084:5;3725:13;3718:21;4062:5;4059:32;4049:2;;4105:1;;4095:12;4049:2;4043:71;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "240200",
                "executionCost": "22649",
                "totalCost": "262849"
              },
              "external": {
                "claimOwnership()": "44971",
                "owner()": "1068",
                "pendingOwner()": "1090",
                "transferOwnership(address,bool,bool)": "infinite"
              }
            },
            "methodIdentifiers": {
              "claimOwnership()": "4e71e0c8",
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978",
              "transferOwnership(address,bool,bool)": "078dfbe7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"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\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"constructor\":\"`owner` defaults to msg.sender on construction.\",\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringOwnable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 905,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BoringOwnable",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 907,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BoringOwnable",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "claimOwnership()": {
                "notice": "Needs to be called by `pendingOwner` to claim ownership."
              },
              "constructor": "`owner` defaults to msg.sender on construction.",
              "transferOwnership(address,bool,bool)": {
                "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
              }
            },
            "version": 1
          }
        },
        "BoringOwnableData": {
          "abi": [
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060e68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80638da5cb5b146037578063e30c3978146051575b600080fd5b603d6057565b60405160489190608f565b60405180910390f35b603d6073565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff9190911681526020019056fea2646970667358221220f5ba4e23beb38befdcf3d16ef1ad71ec6082536e2905014efc28bac26e44999364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0xE6 DUP1 PUSH2 0x1F PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH1 0x51 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3D PUSH1 0x57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x48 SWAP2 SWAP1 PUSH1 0x8F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3D PUSH1 0x73 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 0xBA 0x4E 0x23 0xBE 0xB3 DUP12 0xEF 0xDC RETURN 0xD1 PUSH15 0xF1AD71EC6082536E2905014EFC28BA 0xC2 PUSH15 0x44999364736F6C634300060C003300 ",
              "sourceMap": "13313:89:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052348015600f57600080fd5b506004361060325760003560e01c80638da5cb5b146037578063e30c3978146051575b600080fd5b603d6057565b60405160489190608f565b60405180910390f35b603d6073565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff9190911681526020019056fea2646970667358221220f5ba4e23beb38befdcf3d16ef1ad71ec6082536e2905014efc28bac26e44999364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH1 0x51 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3D PUSH1 0x57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x48 SWAP2 SWAP1 PUSH1 0x8F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3D PUSH1 0x73 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 0xBA 0x4E 0x23 0xBE 0xB3 DUP12 0xEF 0xDC RETURN 0xD1 PUSH15 0xF1AD71EC6082536E2905014EFC28BA 0xC2 PUSH15 0x44999364736F6C634300060C003300 ",
              "sourceMap": "13313:89:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13346:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13372:27;;;:::i;13346:20::-;;;;;;:::o;13372:27::-;;;;;;:::o;125:222:-1:-;525:42;514:54;;;;76:37;;252:2;237:18;;223:124::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "46000",
                "executionCost": "99",
                "totalCost": "46099"
              },
              "external": {
                "owner()": "1024",
                "pendingOwner()": "1046"
              }
            },
            "methodIdentifiers": {
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"BoringOwnableData\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 905,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BoringOwnableData",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 907,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:BoringOwnableData",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IBatchFlashBorrower": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20[]",
                  "name": "tokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "amounts",
                  "type": "uint256[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "fees",
                  "type": "uint256[]"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onBatchFlashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)": {
                "params": {
                  "amounts": "A one-to-one map to `tokens` that is loaned.",
                  "data": "Additional data that was passed to the flashloan function.",
                  "fees": "A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.",
                  "sender": "The address of the invoker of this flashloan.",
                  "tokens": "Array of addresses for ERC-20 tokens that is loaned."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)": "d9d17623"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"fees\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onBatchFlashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)\":{\"params\":{\"amounts\":\"A one-to-one map to `tokens` that is loaned.\",\"data\":\"Additional data that was passed to the flashloan function.\",\"fees\":\"A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\",\"sender\":\"The address of the invoker of this flashloan.\",\"tokens\":\"Array of addresses for ERC-20 tokens that is loaned.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)\":{\"notice\":\"The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"IBatchFlashBorrower\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)": {
                "notice": "The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns."
              }
            },
            "version": 1
          }
        },
        "IERC20": {
          "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": "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": "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": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "decimals()": "313ce567",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
              "totalSupply()": "18160ddd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"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\":\"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\":\"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\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"EIP 2612\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"IERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "EIP 2612"
              }
            },
            "version": 1
          }
        },
        "IFlashBorrower": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "fee",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onFlashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "onFlashLoan(address,address,uint256,uint256,bytes)": {
                "params": {
                  "amount": "of the `token` that is loaned.",
                  "data": "Additional data that was passed to the flashloan function.",
                  "fee": "The fee that needs to be paid on top for this loan. Needs to be the same as `token`.",
                  "sender": "The address of the invoker of this flashloan.",
                  "token": "The address of the token that is loaned."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "onFlashLoan(address,address,uint256,uint256,bytes)": "23e30c8b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onFlashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onFlashLoan(address,address,uint256,uint256,bytes)\":{\"params\":{\"amount\":\"of the `token` that is loaned.\",\"data\":\"Additional data that was passed to the flashloan function.\",\"fee\":\"The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\",\"sender\":\"The address of the invoker of this flashloan.\",\"token\":\"The address of the token that is loaned.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onFlashLoan(address,address,uint256,uint256,bytes)\":{\"notice\":\"The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"IFlashBorrower\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "onFlashLoan(address,address,uint256,uint256,bytes)": {
                "notice": "The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns."
              }
            },
            "version": 1
          }
        },
        "IMasterContract": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "init",
              "outputs": [],
              "stateMutability": "payable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "init(bytes)": {
                "params": {
                  "data": "Can be abi encoded arguments or anything else."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "init(bytes)": "4ddf47d4"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"init(bytes)\":{\"params\":{\"data\":\"Can be abi encoded arguments or anything else.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"init(bytes)\":{\"notice\":\"Init function that gets called from `BoringFactory.deploy`. Also kown as the constructor for cloned contracts. Any ETH send to `BoringFactory.deploy` ends up here.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"IMasterContract\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "init(bytes)": {
                "notice": "Init function that gets called from `BoringFactory.deploy`. Also kown as the constructor for cloned contracts. Any ETH send to `BoringFactory.deploy` ends up here."
              }
            },
            "version": 1
          }
        },
        "IStrategy": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "balance",
                  "type": "uint256"
                }
              ],
              "name": "exit",
              "outputs": [
                {
                  "internalType": "int256",
                  "name": "amountAdded",
                  "type": "int256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "balance",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                }
              ],
              "name": "harvest",
              "outputs": [
                {
                  "internalType": "int256",
                  "name": "amountAdded",
                  "type": "int256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "skim",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "actualAmount",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "exit(uint256)": {
                "params": {
                  "balance": "The amount of tokens the caller thinks it has invested."
                },
                "returns": {
                  "amountAdded": "The delta (+profit or -loss) that occured in contrast to `balance`."
                }
              },
              "harvest(uint256,address)": {
                "params": {
                  "balance": "The amount of tokens the caller thinks it has invested.",
                  "sender": "The address of the initiator of this transaction. Can be used for reimbursements, etc."
                },
                "returns": {
                  "amountAdded": "The delta (+profit or -loss) that occured in contrast to `balance`."
                }
              },
              "skim(uint256)": {
                "params": {
                  "amount": "The amount of tokens to invest."
                }
              },
              "withdraw(uint256)": {
                "details": "The `actualAmount` should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for.",
                "params": {
                  "amount": "The requested amount the caller wants to withdraw."
                },
                "returns": {
                  "actualAmount": "The real amount that is withdrawn."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "exit(uint256)": "7f8661a1",
              "harvest(uint256,address)": "18fccc76",
              "skim(uint256)": "6939aaf5",
              "withdraw(uint256)": "2e1a7d4d"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"exit\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"amountAdded\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"harvest\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"amountAdded\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"skim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"exit(uint256)\":{\"params\":{\"balance\":\"The amount of tokens the caller thinks it has invested.\"},\"returns\":{\"amountAdded\":\"The delta (+profit or -loss) that occured in contrast to `balance`.\"}},\"harvest(uint256,address)\":{\"params\":{\"balance\":\"The amount of tokens the caller thinks it has invested.\",\"sender\":\"The address of the initiator of this transaction. Can be used for reimbursements, etc.\"},\"returns\":{\"amountAdded\":\"The delta (+profit or -loss) that occured in contrast to `balance`.\"}},\"skim(uint256)\":{\"params\":{\"amount\":\"The amount of tokens to invest.\"}},\"withdraw(uint256)\":{\"details\":\"The `actualAmount` should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for.\",\"params\":{\"amount\":\"The requested amount the caller wants to withdraw.\"},\"returns\":{\"actualAmount\":\"The real amount that is withdrawn.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"exit(uint256)\":{\"notice\":\"Withdraw all assets in the safest way possible. This shouldn't fail.\"},\"harvest(uint256,address)\":{\"notice\":\"Harvest any profits made converted to the asset and pass them to the caller.\"},\"skim(uint256)\":{\"notice\":\"Send the assets to the Strategy and call skim to invest them.\"},\"withdraw(uint256)\":{\"notice\":\"Withdraw assets. The returned amount can differ from the requested amount due to rounding.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"IStrategy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "exit(uint256)": {
                "notice": "Withdraw all assets in the safest way possible. This shouldn't fail."
              },
              "harvest(uint256,address)": {
                "notice": "Harvest any profits made converted to the asset and pass them to the caller."
              },
              "skim(uint256)": {
                "notice": "Send the assets to the Strategy and call skim to invest them."
              },
              "withdraw(uint256)": {
                "notice": "Withdraw assets. The returned amount can differ from the requested amount due to rounding."
              }
            },
            "version": 1
          }
        },
        "IWETH": {
          "abi": [
            {
              "inputs": [],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "deposit()": "d0e30db0",
              "withdraw(uint256)": "2e1a7d4d"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"IWETH\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "MasterContractManager": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "name": "LogDeploy",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "protocol",
                  "type": "address"
                }
              ],
              "name": "LogRegisterProtocol",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogSetMasterContractApproval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogWhiteListMasterContract",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "claimOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "internalType": "bool",
                  "name": "useCreate2",
                  "type": "bool"
                }
              ],
              "name": "deploy",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractApproved",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "registerProtocol",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "setMasterContractApproval",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "direct",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "renounce",
                  "type": "bool"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "whitelistMasterContract",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "whitelistedMasterContracts",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "deploy(address,bytes,bool)": {
                "params": {
                  "data": "Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.",
                  "masterContract": "The address of the contract to clone.",
                  "useCreate2": "Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt."
                },
                "returns": {
                  "cloneAddress": "Address of the created clone contract."
                }
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "params": {
                  "approved": "If True approves access. If False revokes access.",
                  "masterContract": "The address who gains or loses access.",
                  "r": "Part of the signature. (See EIP-191)",
                  "s": "Part of the signature. (See EIP-191)",
                  "user": "The address of the user that approves or revokes access.",
                  "v": "Part of the signature. (See EIP-191)"
                }
              },
              "transferOwnership(address,bool,bool)": {
                "params": {
                  "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
                  "newOwner": "Address of the new owner.",
                  "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60c060405234801561001057600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a34660a081905261005f81610068565b60805250610102565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f83306040516020016100c194939291906100de565b604051602081830303815290604052805190602001209050919050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805160a0516114af6101256000398061067c5250806106b152506114af6000f3fe6080604052600436106100d25760003560e01c80637ecebe001161007f578063aee4d1b211610059578063aee4d1b2146101fb578063bafe4f1414610210578063c0a47c9314610230578063e30c397814610250576100d2565b80637ecebe00146101a65780638da5cb5b146101c657806391e0eab5146101db576100d2565b80633644e515116100b05780633644e5151461014f5780634e71e0c814610171578063733a9d7c14610186576100d2565b8063078dfbe7146100d757806312a90c8a146100f95780631f54245b1461012f575b600080fd5b3480156100e357600080fd5b506100f76100f2366004610fd0565b610265565b005b34801561010557600080fd5b50610119610114366004610ee0565b6103f9565b6040516101269190611120565b60405180910390f35b61014261013d366004611019565b61040e565b60405161012691906110ff565b34801561015b57600080fd5b50610164610677565b604051610126919061112b565b34801561017d57600080fd5b506100f76106d7565b34801561019257600080fd5b506100f76101a1366004610fa5565b6107bd565b3480156101b257600080fd5b506101646101c1366004610ee0565b6108e6565b3480156101d257600080fd5b506101426108f8565b3480156101e757600080fd5b506101196101f6366004610f02565b610914565b34801561020757600080fd5b506100f7610934565b34801561021c57600080fd5b5061014261022b366004610ee0565b610993565b34801561023c57600080fd5b506100f761024b366004610f36565b6109bb565b34801561025c57600080fd5b50610142610e14565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906112b6565b60405180910390fd5b81156103b35773ffffffffffffffffffffffffffffffffffffffff83161515806102e65750805b61031c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061127f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091556001805490911690556103f4565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60046020526000908152604090205460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff851661045d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061138e565b606085901b82156104e6576000858560405161047a9291906110ab565b604051809103902090506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152816037826000f593505050610542565b6040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09250505b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600260205260409081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938a169390931790925590517f4ddf47d4000000000000000000000000000000000000000000000000000000008152634ddf47d49034906105d590899089906004016111c4565b6000604051808303818588803b1580156105ee57600080fd5b505af1158015610602573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b87876040516106669291906111c4565b60405180910390a350949350505050565b6000467f000000000000000000000000000000000000000000000000000000000000000081146106af576106aa81610e30565b6106d1565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906112eb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906112b6565b73ffffffffffffffffffffffffffffffffffffffff821661085b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611211565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e2600906108da908490611120565b60405180910390a25050565b60056020526000908152604090205481565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600360209081526000928352604080842090915290825290205460ff1681565b3360008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8516610a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906113c3565b81158015610a14575080155b8015610a21575060ff8316155b15610b385773ffffffffffffffffffffffffffffffffffffffff86163314610a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611248565b73ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409020541615610ad4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611320565b73ffffffffffffffffffffffffffffffffffffffff851660009081526004602052604090205460ff16610b33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611431565b610d75565b73ffffffffffffffffffffffffffffffffffffffff8616610b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906113fa565b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250610bc5610677565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade287610c11577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b1610c33565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b73ffffffffffffffffffffffffffffffffffffffff8b166000908152600560209081526040918290208054600181019091559151610c7a9493928e928e928e929101611134565b60405160208183030381529060405280519060200120604051602001610ca2939291906110bb565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051610cdf94939291906111a6565b6020604051602081039080840390855afa158015610d01573d6000803e3d6000fd5b5050506020604051035190508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611357565b50505b73ffffffffffffffffffffffffffffffffffffffff8581166000818152600360209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b05925790610e04908890611120565b60405180910390a3505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f8330604051602001610e899493929190611175565b604051602081830303815290604052805190602001209050919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610eca57600080fd5b92915050565b80358015158114610eca57600080fd5b600060208284031215610ef1578081fd5b610efb8383610ea6565b9392505050565b60008060408385031215610f14578081fd5b610f1e8484610ea6565b9150610f2d8460208501610ea6565b90509250929050565b60008060008060008060c08789031215610f4e578182fd5b610f588888610ea6565b9550610f678860208901610ea6565b9450610f768860408901610ed0565b9350606087013560ff81168114610f8b578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215610fb7578182fd5b610fc18484610ea6565b9150610f2d8460208501610ed0565b600080600060608486031215610fe4578283fd5b610fee8585610ea6565b92506020840135610ffe81611468565b9150604084013561100e81611468565b809150509250925092565b6000806000806060858703121561102e578384fd5b6110388686610ea6565b9350602085013567ffffffffffffffff80821115611054578485fd5b818701915087601f830112611067578485fd5b813581811115611075578586fd5b886020828501011115611086578586fd5b60208301955080945050505060408501356110a081611468565b939692955090935050565b6000828483379101908152919050565b60008451815b818110156110db57602081880181015185830152016110c1565b818111156110e95782828501525b5091909101928352506020820152604001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b958652602086019490945273ffffffffffffffffffffffffffffffffffffffff9283166040860152911660608401521515608083015260a082015260c00190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b801515811461147657600080fd5b5056fea264697066735822122059b136d12156cc9d240858553e3fa696171312f714396e6239324ec612608fcc64736f6c634300060c0033",
              "opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 CHAINID PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH2 0x5F DUP2 PUSH2 0x68 JUMP JUMPDEST PUSH1 0x80 MSTORE POP PUSH2 0x102 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xC1 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xDE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x14AF PUSH2 0x125 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x67C MSTORE POP DUP1 PUSH2 0x6B1 MSTORE POP PUSH2 0x14AF PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xD2 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7ECEBE00 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xAEE4D1B2 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x250 JUMPI PUSH2 0xD2 JUMP JUMPDEST DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x1DB JUMPI PUSH2 0xD2 JUMP JUMPDEST DUP1 PUSH4 0x3644E515 GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x14F JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x171 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x186 JUMPI PUSH2 0xD2 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0xD7 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0xF9 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x12F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0xF2 CALLDATASIZE PUSH1 0x4 PUSH2 0xFD0 JUMP JUMPDEST PUSH2 0x265 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x105 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x119 PUSH2 0x114 CALLDATASIZE PUSH1 0x4 PUSH2 0xEE0 JUMP JUMPDEST PUSH2 0x3F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x126 SWAP2 SWAP1 PUSH2 0x1120 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x142 PUSH2 0x13D CALLDATASIZE PUSH1 0x4 PUSH2 0x1019 JUMP JUMPDEST PUSH2 0x40E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x126 SWAP2 SWAP1 PUSH2 0x10FF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x164 PUSH2 0x677 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x126 SWAP2 SWAP1 PUSH2 0x112B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x6D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x192 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x1A1 CALLDATASIZE PUSH1 0x4 PUSH2 0xFA5 JUMP JUMPDEST PUSH2 0x7BD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x164 PUSH2 0x1C1 CALLDATASIZE PUSH1 0x4 PUSH2 0xEE0 JUMP JUMPDEST PUSH2 0x8E6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x142 PUSH2 0x8F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x119 PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0xF02 JUMP JUMPDEST PUSH2 0x914 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x934 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x142 PUSH2 0x22B CALLDATASIZE PUSH1 0x4 PUSH2 0xEE0 JUMP JUMPDEST PUSH2 0x993 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x24B CALLDATASIZE PUSH1 0x4 PUSH2 0xF36 JUMP JUMPDEST PUSH2 0x9BB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x142 PUSH2 0xE14 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x12B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x3B3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x2E6 JUMPI POP DUP1 JUMPDEST PUSH2 0x31C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x127F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x3F4 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x45D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x138E JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x4E6 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x47A SWAP3 SWAP2 SWAP1 PUSH2 0x10AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x542 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x4DDF47D400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x5D5 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x11C4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x602 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x666 SWAP3 SWAP2 SWAP1 PUSH2 0x11C4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x6AF JUMPI PUSH2 0x6AA DUP2 PUSH2 0xE30 JUMP JUMPDEST PUSH2 0x6D1 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x729 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x12EB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x80E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x12B6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x85B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1211 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x8DA SWAP1 DUP5 SWAP1 PUSH2 0x1120 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0xA08 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x13C3 JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0xA14 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0xA21 JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0xB38 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0xA75 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1248 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0xAD4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1320 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xB33 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1431 JUMP JUMPDEST PUSH2 0xD75 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0xB85 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x13FA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0xBC5 PUSH2 0x677 JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0xC11 JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0xC33 JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0xC7A SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0x1134 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xCA2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0xCDF SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11A6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD01 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xD72 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1357 JUMP JUMPDEST POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0xE04 SWAP1 DUP9 SWAP1 PUSH2 0x1120 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xE89 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1175 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xECA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xECA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xEF1 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xEFB DUP4 DUP4 PUSH2 0xEA6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xF14 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xF1E DUP5 DUP5 PUSH2 0xEA6 JUMP JUMPDEST SWAP2 POP PUSH2 0xF2D DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xEA6 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xF4E JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xF58 DUP9 DUP9 PUSH2 0xEA6 JUMP JUMPDEST SWAP6 POP PUSH2 0xF67 DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0xEA6 JUMP JUMPDEST SWAP5 POP PUSH2 0xF76 DUP9 PUSH1 0x40 DUP10 ADD PUSH2 0xED0 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xF8B JUMPI DUP3 DUP4 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP3 SWAP6 PUSH1 0x80 DUP2 ADD CALLDATALOAD SWAP5 PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFB7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xFC1 DUP5 DUP5 PUSH2 0xEA6 JUMP JUMPDEST SWAP2 POP PUSH2 0xF2D DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xED0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xFE4 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xFEE DUP6 DUP6 PUSH2 0xEA6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xFFE DUP2 PUSH2 0x1468 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x100E DUP2 PUSH2 0x1468 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x102E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1038 DUP7 DUP7 PUSH2 0xEA6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1054 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1067 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1075 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1086 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x10A0 DUP2 PUSH2 0x1468 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x10DB JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x10C1 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x10E9 JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 PUSH1 0x20 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x40 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A207A65726F20616464726573730000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1476 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSIZE 0xB1 CALLDATASIZE 0xD1 0x21 JUMP 0xCC SWAP14 0x24 ADDMOD PC SSTORE RETURNDATACOPY EXTCODEHASH 0xA6 SWAP7 OR SGT SLT 0xF7 EQ CODECOPY PUSH15 0x6239324EC612608FCC64736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "18364:6149:0:-:0;;;19760:207;;;;;;;;;-1:-1:-1;13639:5:0;:18;;-1:-1:-1;;;;;;13639:18:0;13647:10;13639:18;;;;;13672:44;;13647:10;;13639:5;13672:44;;13639:5;;13672:44;19850:9;19924:35;;;;19898:62;19850:9;19898:25;:62::i;:::-;19878:82;;-1:-1:-1;18364:6149:0;;19973:211;20047:7;19146:80;20127:24;20153:7;20170:4;20083:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20073:104;;;;;;20066:111;;19973:211;;;:::o;365:556:-1:-;196:37;;;741:2;726:18;;196:37;;;;824:2;809:18;;196:37;-1:-1;;;;;1167:54;907:2;892:18;;76:37;576:3;561:19;;547:374::o;:::-;18364:6149:0;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "1170": [
                  {
                    "length": 32,
                    "start": 1713
                  }
                ],
                "1172": [
                  {
                    "length": 32,
                    "start": 1660
                  }
                ]
              },
              "linkReferences": {},
              "object": "6080604052600436106100d25760003560e01c80637ecebe001161007f578063aee4d1b211610059578063aee4d1b2146101fb578063bafe4f1414610210578063c0a47c9314610230578063e30c397814610250576100d2565b80637ecebe00146101a65780638da5cb5b146101c657806391e0eab5146101db576100d2565b80633644e515116100b05780633644e5151461014f5780634e71e0c814610171578063733a9d7c14610186576100d2565b8063078dfbe7146100d757806312a90c8a146100f95780631f54245b1461012f575b600080fd5b3480156100e357600080fd5b506100f76100f2366004610fd0565b610265565b005b34801561010557600080fd5b50610119610114366004610ee0565b6103f9565b6040516101269190611120565b60405180910390f35b61014261013d366004611019565b61040e565b60405161012691906110ff565b34801561015b57600080fd5b50610164610677565b604051610126919061112b565b34801561017d57600080fd5b506100f76106d7565b34801561019257600080fd5b506100f76101a1366004610fa5565b6107bd565b3480156101b257600080fd5b506101646101c1366004610ee0565b6108e6565b3480156101d257600080fd5b506101426108f8565b3480156101e757600080fd5b506101196101f6366004610f02565b610914565b34801561020757600080fd5b506100f7610934565b34801561021c57600080fd5b5061014261022b366004610ee0565b610993565b34801561023c57600080fd5b506100f761024b366004610f36565b6109bb565b34801561025c57600080fd5b50610142610e14565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906112b6565b60405180910390fd5b81156103b35773ffffffffffffffffffffffffffffffffffffffff83161515806102e65750805b61031c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061127f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091556001805490911690556103f4565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60046020526000908152604090205460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff851661045d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b69061138e565b606085901b82156104e6576000858560405161047a9291906110ab565b604051809103902090506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152816037826000f593505050610542565b6040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09250505b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600260205260409081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938a169390931790925590517f4ddf47d4000000000000000000000000000000000000000000000000000000008152634ddf47d49034906105d590899089906004016111c4565b6000604051808303818588803b1580156105ee57600080fd5b505af1158015610602573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b87876040516106669291906111c4565b60405180910390a350949350505050565b6000467f000000000000000000000000000000000000000000000000000000000000000081146106af576106aa81610e30565b6106d1565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610729576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906112eb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906112b6565b73ffffffffffffffffffffffffffffffffffffffff821661085b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611211565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e2600906108da908490611120565b60405180910390a25050565b60056020526000908152604090205481565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600360209081526000928352604080842090915290825290205460ff1681565b3360008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8516610a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906113c3565b81158015610a14575080155b8015610a21575060ff8316155b15610b385773ffffffffffffffffffffffffffffffffffffffff86163314610a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611248565b73ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409020541615610ad4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611320565b73ffffffffffffffffffffffffffffffffffffffff851660009081526004602052604090205460ff16610b33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611431565b610d75565b73ffffffffffffffffffffffffffffffffffffffff8616610b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906113fa565b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250610bc5610677565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade287610c11577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b1610c33565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b73ffffffffffffffffffffffffffffffffffffffff8b166000908152600560209081526040918290208054600181019091559151610c7a9493928e928e928e929101611134565b60405160208183030381529060405280519060200120604051602001610ca2939291906110bb565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051610cdf94939291906111a6565b6020604051602081039080840390855afa158015610d01573d6000803e3d6000fd5b5050506020604051035190508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b690611357565b50505b73ffffffffffffffffffffffffffffffffffffffff8581166000818152600360209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b05925790610e04908890611120565b60405180910390a3505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f8330604051602001610e899493929190611175565b604051602081830303815290604052805190602001209050919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610eca57600080fd5b92915050565b80358015158114610eca57600080fd5b600060208284031215610ef1578081fd5b610efb8383610ea6565b9392505050565b60008060408385031215610f14578081fd5b610f1e8484610ea6565b9150610f2d8460208501610ea6565b90509250929050565b60008060008060008060c08789031215610f4e578182fd5b610f588888610ea6565b9550610f678860208901610ea6565b9450610f768860408901610ed0565b9350606087013560ff81168114610f8b578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215610fb7578182fd5b610fc18484610ea6565b9150610f2d8460208501610ed0565b600080600060608486031215610fe4578283fd5b610fee8585610ea6565b92506020840135610ffe81611468565b9150604084013561100e81611468565b809150509250925092565b6000806000806060858703121561102e578384fd5b6110388686610ea6565b9350602085013567ffffffffffffffff80821115611054578485fd5b818701915087601f830112611067578485fd5b813581811115611075578586fd5b886020828501011115611086578586fd5b60208301955080945050505060408501356110a081611468565b939692955090935050565b6000828483379101908152919050565b60008451815b818110156110db57602081880181015185830152016110c1565b818111156110e95782828501525b5091909101928352506020820152604001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b958652602086019490945273ffffffffffffffffffffffffffffffffffffffff9283166040860152911660608401521515608083015260a082015260c00190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b801515811461147657600080fd5b5056fea264697066735822122059b136d12156cc9d240858553e3fa696171312f714396e6239324ec612608fcc64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xD2 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7ECEBE00 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xAEE4D1B2 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x250 JUMPI PUSH2 0xD2 JUMP JUMPDEST DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x1DB JUMPI PUSH2 0xD2 JUMP JUMPDEST DUP1 PUSH4 0x3644E515 GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x14F JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x171 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x186 JUMPI PUSH2 0xD2 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0xD7 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0xF9 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x12F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0xF2 CALLDATASIZE PUSH1 0x4 PUSH2 0xFD0 JUMP JUMPDEST PUSH2 0x265 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x105 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x119 PUSH2 0x114 CALLDATASIZE PUSH1 0x4 PUSH2 0xEE0 JUMP JUMPDEST PUSH2 0x3F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x126 SWAP2 SWAP1 PUSH2 0x1120 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x142 PUSH2 0x13D CALLDATASIZE PUSH1 0x4 PUSH2 0x1019 JUMP JUMPDEST PUSH2 0x40E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x126 SWAP2 SWAP1 PUSH2 0x10FF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x164 PUSH2 0x677 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x126 SWAP2 SWAP1 PUSH2 0x112B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x6D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x192 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x1A1 CALLDATASIZE PUSH1 0x4 PUSH2 0xFA5 JUMP JUMPDEST PUSH2 0x7BD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x164 PUSH2 0x1C1 CALLDATASIZE PUSH1 0x4 PUSH2 0xEE0 JUMP JUMPDEST PUSH2 0x8E6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x142 PUSH2 0x8F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x119 PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0xF02 JUMP JUMPDEST PUSH2 0x914 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x934 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x142 PUSH2 0x22B CALLDATASIZE PUSH1 0x4 PUSH2 0xEE0 JUMP JUMPDEST PUSH2 0x993 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF7 PUSH2 0x24B CALLDATASIZE PUSH1 0x4 PUSH2 0xF36 JUMP JUMPDEST PUSH2 0x9BB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x142 PUSH2 0xE14 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x12B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x3B3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x2E6 JUMPI POP DUP1 JUMPDEST PUSH2 0x31C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x127F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x3F4 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x45D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x138E JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x4E6 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x47A SWAP3 SWAP2 SWAP1 PUSH2 0x10AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x542 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3D602D80600A3D3981F3363D3D373D3D3D363D73000000000000000000000000 DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH32 0x5AF43D82803E903D91602B57FD5BF30000000000000000000000000000000000 PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x4DDF47D400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x5D5 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x11C4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x602 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x666 SWAP3 SWAP2 SWAP1 PUSH2 0x11C4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x6AF JUMPI PUSH2 0x6AA DUP2 PUSH2 0xE30 JUMP JUMPDEST PUSH2 0x6D1 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x729 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x12EB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x80E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x12B6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0x85B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1211 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x8DA SWAP1 DUP5 SWAP1 PUSH2 0x1120 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0xA08 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x13C3 JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0xA14 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0xA21 JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0xB38 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0xA75 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1248 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0xAD4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1320 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xB33 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1431 JUMP JUMPDEST PUSH2 0xD75 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH2 0xB85 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x13FA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0xBC5 PUSH2 0x677 JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0xC11 JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0xC33 JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0xC7A SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0x1134 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xCA2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0xCDF SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11A6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD01 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xD72 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B6 SWAP1 PUSH2 0x1357 JUMP JUMPDEST POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0xE04 SWAP1 DUP9 SWAP1 PUSH2 0x1120 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xE89 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1175 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xECA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xECA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xEF1 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xEFB DUP4 DUP4 PUSH2 0xEA6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xF14 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xF1E DUP5 DUP5 PUSH2 0xEA6 JUMP JUMPDEST SWAP2 POP PUSH2 0xF2D DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xEA6 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xF4E JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xF58 DUP9 DUP9 PUSH2 0xEA6 JUMP JUMPDEST SWAP6 POP PUSH2 0xF67 DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0xEA6 JUMP JUMPDEST SWAP5 POP PUSH2 0xF76 DUP9 PUSH1 0x40 DUP10 ADD PUSH2 0xED0 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xF8B JUMPI DUP3 DUP4 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP3 SWAP6 PUSH1 0x80 DUP2 ADD CALLDATALOAD SWAP5 PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xFB7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xFC1 DUP5 DUP5 PUSH2 0xEA6 JUMP JUMPDEST SWAP2 POP PUSH2 0xF2D DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xED0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xFE4 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xFEE DUP6 DUP6 PUSH2 0xEA6 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xFFE DUP2 PUSH2 0x1468 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x100E DUP2 PUSH2 0x1468 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x102E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1038 DUP7 DUP7 PUSH2 0xEA6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1054 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1067 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1075 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1086 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x10A0 DUP2 PUSH2 0x1468 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x10DB JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x10C1 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x10E9 JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 PUSH1 0x20 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x40 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A207A65726F20616464726573730000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1476 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSIZE 0xB1 CALLDATASIZE 0xD1 0x21 JUMP 0xCC SWAP14 0x24 ADDMOD PC SSTORE RETURNDATACOPY EXTCODEHASH 0xA6 SWAP7 OR SGT SLT 0xF7 EQ CODECOPY PUSH15 0x6239324EC612608FCC64736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "18364:6149:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14182:489;;;;;;;;;;-1:-1:-1;14182:489:0;;;;;:::i;:::-;;:::i;:::-;;18910:58;;;;;;;;;;-1:-1:-1;18910:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16611:1670;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20243:262::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;14750:330::-;;;;;;;;;;;;;:::i;20864:343::-;;;;;;;;;;-1:-1:-1;20864:343:0;;;;;:::i;:::-;;:::i;19031:41::-;;;;;;;;;;-1:-1:-1;19031:41:0;;;;;:::i;:::-;;:::i;13346:20::-;;;;;;;;;;;;;:::i;18742:74::-;;;;;;;;;;-1:-1:-1;18742:74:0;;;;;:::i;:::-;;:::i;20635:139::-;;;;;;;;;;;;;:::i;16029:51::-;;;;;;;;;;-1:-1:-1;16029:51:0;;;;;:::i;:::-;;:::i;21964:2547::-;;;;;;;;;;-1:-1:-1;21964:2547:0;;;;;:::i;:::-;;:::i;13372:27::-;;;;;;;;;;;;;:::i;14182:489::-;15204:5;;;;15190:10;:19;15182:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14316:6:::1;14312:353;;;14368:22;::::0;::::1;::::0;::::1;::::0;:34:::1;;;14394:8;14368:34;14360:68;;;;;;;;;;;;:::i;:::-;14492:5;::::0;;14471:37:::1;::::0;::::1;::::0;;::::1;::::0;14492:5;::::1;::::0;14471:37:::1;::::0;::::1;14522:5;:16:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;14552:25;;;;::::1;::::0;;14312:353:::1;;;14631:12;:23:::0;;;::::1;;::::0;::::1;;::::0;;14312:353:::1;14182:489:::0;;;:::o;18910:58::-;;;;;;;;;;;;;;;:::o;16611:1670::-;16743:20;16783:28;;;16775:73;;;;;;;;;;;;:::i;:::-;16880:23;;;;16974:1114;;;;17115:12;17140:4;;17130:15;;;;;;;:::i;:::-;;;;;;;;17115:30;;17325:4;17319:11;17361:66;17354:5;17347:81;17470:11;17463:4;17456:5;17452:16;17445:37;17524:66;17517:4;17510:5;17506:16;17499:92;17648:4;17642;17635:5;17632:1;17624:29;17608:45;;;17288:379;;;;17743:4;17737:11;17779:66;17772:5;17765:81;17888:11;17881:4;17874:5;17870:16;17863:37;17942:66;17935:4;17928:5;17924:16;17917:92;18059:4;18052:5;18049:1;18042:22;18026:38;;;17706:372;18097:30;;;;;;;;:16;:30;;;;;;;:47;;;;;;;;;;;;;;18155:58;;;;;:34;;18197:9;;18155:58;;18208:4;;;;18155:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18261:12;18229:45;;18239:14;18229:45;;;18255:4;;18229:45;;;;;;;:::i;:::-;;;;;;;;16611:1670;;;;;;;:::o;20243:262::-;20292:7;20370:9;20416:25;20405:36;;:93;;20464:34;20490:7;20464:25;:34::i;:::-;20405:93;;;20444:17;20405:93;20398:100;;;20243:262;:::o;14750:330::-;14817:12;;;;14866:10;:27;;14858:72;;;;;;;;;;;;:::i;:::-;14986:5;;;14965:42;;;;;;;14986:5;;;14965:42;;;15017:5;:21;;;;;;;;;;;;;;15048:25;;;;;;;14750:330::o;20864:343::-;15204:5;;;;15190:10;:19;15182:64;;;;;;;;;;;;:::i;:::-;20989:28:::1;::::0;::::1;20981:69;;;;;;;;;;;;:::i;:::-;21080:42;::::0;::::1;;::::0;;;:26:::1;:42;::::0;;;;;;:53;;;::::1;::::0;::::1;;;::::0;;21148:52;::::1;::::0;::::1;::::0;21080:53;;21148:52:::1;:::i;:::-;;;;;;;;20864:343:::0;;:::o;19031:41::-;;;;;;;;;;;;;:::o;13346:20::-;;;;;;:::o;18742:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20635:139::-;20711:10;20680:28;;;;:16;:28;;;;;;:41;;;;;;;;20736:31;;;20680:28;20736:31;20635:139::o;16029:51::-;;;;;;;;;;;;;;;:::o;21964:2547::-;22180:28;;;22172:68;;;;;;;;;;;;:::i;:::-;22346:6;;:16;;;;-1:-1:-1;22356:6:0;;22346:16;:26;;;;-1:-1:-1;22366:6:0;;;;22346:26;22342:2003;;;22396:18;;;22404:10;22396:18;22388:58;;;;;;;;;;;;:::i;:::-;22468:36;:22;;;22502:1;22468:22;;;:16;:22;;;;;;;:36;22460:74;;;;;;;;;;;;:::i;:::-;22556:42;;;;;;;:26;:42;;;;;;;;22548:82;;;;;;;;;;;;:::i;:::-;22342:2003;;;22955:18;;;22947:59;;;;;;;;;;;;:::i;:::-;23449:14;23531:40;;;;;;;;;;;;;;;;;23593:18;:16;:18::i;:::-;19424:118;23761:8;:186;;23908:39;23761:186;;;23804:69;23761:186;24093:12;;;;;;;:6;:12;;;;;;;;;:14;;;;;;;;23668:465;;;;;;23977:4;;24011:14;;24055:8;;24093:14;23668:465;;:::i;:::-;;;;;;;;;;;;;23633:522;;;;;;23493:680;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23466:721;;;;;;23449:738;;24201:24;24228:26;24238:6;24246:1;24249;24252;24228:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24201:53;;24296:4;24276:24;;:16;:24;;;24268:66;;;;;;;;;;;;:::i;:::-;22342:2003;;;24374:38;;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;;;:55;;;;;;;;;;24444:60;;;;;24374:55;;24444:60;:::i;:::-;;;;;;;;21964:2547;;;;;;:::o;13372:27::-;;;;;;:::o;19973:211::-;20047:7;19146:80;20127:24;20153:7;20170:4;20083:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20073:104;;;;;;20066:111;;19973:211;;;:::o;5:130:-1:-;72:20;;19106:42;19095:54;;20004:35;;19994:2;;20053:1;;20043:12;19994:2;57:78;;;;:::o;142:124::-;206:20;;18928:13;;18921:21;20125:32;;20115:2;;20171:1;;20161:12;901:241;;1005:2;993:9;984:7;980:23;976:32;973:2;;;-1:-1;;1011:12;973:2;1073:53;1118:7;1094:22;1073:53;:::i;:::-;1063:63;967:175;-1:-1;;;967:175::o;1149:366::-;;;1270:2;1258:9;1249:7;1245:23;1241:32;1238:2;;;-1:-1;;1276:12;1238:2;1338:53;1383:7;1359:22;1338:53;:::i;:::-;1328:63;;1446:53;1491:7;1428:2;1471:9;1467:22;1446:53;:::i;:::-;1436:63;;1232:283;;;;;:::o;1522:859::-;;;;;;;1706:3;1694:9;1685:7;1681:23;1677:33;1674:2;;;-1:-1;;1713:12;1674:2;1775:53;1820:7;1796:22;1775:53;:::i;:::-;1765:63;;1883:53;1928:7;1865:2;1908:9;1904:22;1883:53;:::i;:::-;1873:63;;1991:50;2033:7;1973:2;2013:9;2009:22;1991:50;:::i;:::-;1981:60;;2078:2;2119:9;2115:22;833:20;19311:4;20394:5;19300:16;20371:5;20368:33;20358:2;;-1:-1;;20405:12;20358:2;1668:713;;;;-1:-1;1668:713;;2184:3;2224:22;;340:20;;2293:3;2333:22;;;340:20;;-1:-1;1668:713;-1:-1;;1668:713::o;2388:360::-;;;2506:2;2494:9;2485:7;2481:23;2477:32;2474:2;;;-1:-1;;2512:12;2474:2;2574:53;2619:7;2595:22;2574:53;:::i;:::-;2564:63;;2682:50;2724:7;2664:2;2704:9;2700:22;2682:50;:::i;2755:479::-;;;;2887:2;2875:9;2866:7;2862:23;2858:32;2855:2;;;-1:-1;;2893:12;2855:2;2955:53;3000:7;2976:22;2955:53;:::i;:::-;2945:63;;3045:2;3085:9;3081:22;206:20;231:30;255:5;231:30;:::i;:::-;3053:60;-1:-1;3150:2;3186:22;;206:20;231:30;206:20;231:30;:::i;:::-;3158:60;;;;2849:385;;;;;:::o;3241:609::-;;;;;3395:2;3383:9;3374:7;3370:23;3366:32;3363:2;;;-1:-1;;3401:12;3363:2;3463:53;3508:7;3484:22;3463:53;:::i;:::-;3453:63;;3581:2;3570:9;3566:18;3553:32;3605:18;;3597:6;3594:30;3591:2;;;-1:-1;;3627:12;3591:2;3712:6;3701:9;3697:22;;;538:3;531:4;523:6;519:17;515:27;505:2;;-1:-1;;546:12;505:2;589:6;576:20;3605:18;608:6;605:30;602:2;;;-1:-1;;638:12;602:2;733:3;3581:2;713:17;674:6;699:32;;696:41;693:2;;;-1:-1;;740:12;693:2;3581;674:6;670:17;3647:82;;;;;;;;3766:2;3806:9;3802:22;206:20;231:30;255:5;231:30;:::i;:::-;3357:493;;;;-1:-1;3357:493;;-1:-1;;3357:493::o;9344:291::-;;19410:6;19405:3;19400;19387:30;19448:16;;19441:27;;;19448:16;9488:147;-1:-1;9488:147::o;9642:553::-;;5199:5;18073:12;-1:-1;19555:101;19569:6;19566:1;19563:13;19555:101;;;5344:4;19636:11;;;;;19630:18;19617:11;;;19610:39;19584:10;19555:101;;;19671:6;19668:1;19665:13;19662:2;;;-1:-1;19727:6;19722:3;19718:16;19711:27;19662:2;-1:-1;5375:16;;;;4159:37;;;-1:-1;5344:4;10047:12;;4159:37;10158:12;;;9834:361;-1:-1;9834:361::o;10202:222::-;19106:42;19095:54;;;;3928:37;;10329:2;10314:18;;10300:124::o;10431:210::-;18928:13;;18921:21;4042:34;;10552:2;10537:18;;10523:118::o;10648:222::-;4159:37;;;10775:2;10760:18;;10746:124::o;10877:768::-;4159:37;;;11303:2;11288:18;;4159:37;;;;19106:42;19095:54;;;11386:2;11371:18;;3928:37;19095:54;;11469:2;11454:18;;3928:37;18928:13;18921:21;11546:3;11531:19;;4042:34;11630:3;11615:19;;4159:37;11138:3;11123:19;;11109:536::o;11652:556::-;4159:37;;;12028:2;12013:18;;4159:37;;;;12111:2;12096:18;;4159:37;19106:42;19095:54;12194:2;12179:18;;3928:37;11863:3;11848:19;;11834:374::o;12215:548::-;4159:37;;;19311:4;19300:16;;;;12583:2;12568:18;;9297:35;12666:2;12651:18;;4159:37;12749:2;12734:18;;4159:37;12422:3;12407:19;;12393:370::o;12770:326::-;;12925:2;12946:17;12939:47;18229:6;12925:2;12914:9;12910:18;18217:19;19410:6;19405:3;18257:14;12914:9;18257:14;19387:30;19448:16;;;18257:14;19448:16;;;19441:27;;;;19928:2;19908:14;;;19924:7;19904:28;4642:39;;;12896:200;-1:-1;12896:200::o;13103:416::-;13303:2;13317:47;;;5628:2;13288:18;;;18217:19;5664:30;18257:14;;;5644:51;5714:12;;;13274:245::o;13526:416::-;13726:2;13740:47;;;5965:2;13711:18;;;18217:19;6001:29;18257:14;;;5981:50;6050:12;;;13697:245::o;13949:416::-;14149:2;14163:47;;;6301:2;14134:18;;;18217:19;6337:23;18257:14;;;6317:44;6380:12;;;14120:245::o;14372:416::-;14572:2;14586:47;;;14557:18;;;18217:19;6667:34;18257:14;;;6647:55;6721:12;;;14543:245::o;14795:416::-;14995:2;15009:47;;;14980:18;;;18217:19;7008:34;18257:14;;;6988:55;7062:12;;;14966:245::o;15218:416::-;15418:2;15432:47;;;7313:2;15403:18;;;18217:19;7349:27;18257:14;;;7329:48;7396:12;;;15389:245::o;15641:416::-;15841:2;15855:47;;;7647:2;15826:18;;;18217:19;7683:31;18257:14;;;7663:52;7734:12;;;15812:245::o;16064:416::-;16264:2;16278:47;;;16249:18;;;18217:19;8021:34;18257:14;;;8001:55;8075:12;;;16235:245::o;16487:416::-;16687:2;16701:47;;;8326:2;16672:18;;;18217:19;8362:29;18257:14;;;8342:50;8411:12;;;16658:245::o;16910:416::-;17110:2;17124:47;;;8662:2;17095:18;;;18217:19;8698:30;18257:14;;;8678:51;8748:12;;;17081:245::o;17333:416::-;17533:2;17547:47;;;8999:2;17518:18;;;18217:19;9035:29;18257:14;;;9015:50;9084:12;;;17504:245::o;20069:111::-;20150:5;18928:13;18921:21;20128:5;20125:32;20115:2;;20171:1;;20161:12;20115:2;20109:71;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1059000",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "claimOwnership()": "45016",
                "deploy(address,bytes,bool)": "infinite",
                "masterContractApproved(address,address)": "infinite",
                "masterContractOf(address)": "1307",
                "nonces(address)": "1268",
                "owner()": "1091",
                "pendingOwner()": "1134",
                "registerProtocol()": "22195",
                "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "infinite",
                "transferOwnership(address,bool,bool)": "infinite",
                "whitelistMasterContract(address,bool)": "infinite",
                "whitelistedMasterContracts(address)": "1303"
              },
              "internal": {
                "_calculateDomainSeparator(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "claimOwnership()": "4e71e0c8",
              "deploy(address,bytes,bool)": "1f54245b",
              "masterContractApproved(address,address)": "91e0eab5",
              "masterContractOf(address)": "bafe4f14",
              "nonces(address)": "7ecebe00",
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978",
              "registerProtocol()": "aee4d1b2",
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "c0a47c93",
              "transferOwnership(address,bool,bool)": "078dfbe7",
              "whitelistMasterContract(address,bool)": "733a9d7c",
              "whitelistedMasterContracts(address)": "12a90c8a"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"name\":\"LogDeploy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"protocol\",\"type\":\"address\"}],\"name\":\"LogRegisterProtocol\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogSetMasterContractApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogWhiteListMasterContract\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"useCreate2\",\"type\":\"bool\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractApproved\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registerProtocol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setMasterContractApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"whitelistMasterContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedMasterContracts\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,bool)\":{\"params\":{\"data\":\"Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\",\"masterContract\":\"The address of the contract to clone.\",\"useCreate2\":\"Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\"},\"returns\":{\"cloneAddress\":\"Address of the created clone contract.\"}},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"params\":{\"approved\":\"If True approves access. If False revokes access.\",\"masterContract\":\"The address who gains or loses access.\",\"r\":\"Part of the signature. (See EIP-191)\",\"s\":\"Part of the signature. (See EIP-191)\",\"user\":\"The address of the user that approves or revokes access.\",\"v\":\"Part of the signature. (See EIP-191)\"}},\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"deploy(address,bytes,bool)\":{\"notice\":\"Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`.\"},\"masterContractApproved(address,address)\":{\"notice\":\"masterContract to user to approval state\"},\"masterContractOf(address)\":{\"notice\":\"Mapping from clone contracts to their masterContract.\"},\"nonces(address)\":{\"notice\":\"user nonces for masterContract approvals\"},\"registerProtocol()\":{\"notice\":\"Other contracts need to register with this master contract so that users can approve them for the BentoBox.\"},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"notice\":\"Approves or revokes a `masterContract` access to `user` funds.\"},\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"},\"whitelistMasterContract(address,bool)\":{\"notice\":\"Enables or disables a contract for approval without signed message.\"},\"whitelistedMasterContracts(address)\":{\"notice\":\"masterContract to whitelisted state for approval without signed message\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"MasterContractManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 905,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:MasterContractManager",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 907,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:MasterContractManager",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              },
              {
                "astId": 1051,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:MasterContractManager",
                "label": "masterContractOf",
                "offset": 0,
                "slot": "2",
                "type": "t_mapping(t_address,t_address)"
              },
              {
                "astId": 1145,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:MasterContractManager",
                "label": "masterContractApproved",
                "offset": 0,
                "slot": "3",
                "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
              },
              {
                "astId": 1150,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:MasterContractManager",
                "label": "whitelistedMasterContracts",
                "offset": 0,
                "slot": "4",
                "type": "t_mapping(t_address,t_bool)"
              },
              {
                "astId": 1155,
                "contract": "contracts/flat/BentoBoxV1Flat.sol:MasterContractManager",
                "label": "nonces",
                "offset": 0,
                "slot": "5",
                "type": "t_mapping(t_address,t_uint256)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_address,t_mapping(t_address,t_bool))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => bool))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_bool)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "claimOwnership()": {
                "notice": "Needs to be called by `pendingOwner` to claim ownership."
              },
              "deploy(address,bytes,bool)": {
                "notice": "Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`."
              },
              "masterContractApproved(address,address)": {
                "notice": "masterContract to user to approval state"
              },
              "masterContractOf(address)": {
                "notice": "Mapping from clone contracts to their masterContract."
              },
              "nonces(address)": {
                "notice": "user nonces for masterContract approvals"
              },
              "registerProtocol()": {
                "notice": "Other contracts need to register with this master contract so that users can approve them for the BentoBox."
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "notice": "Approves or revokes a `masterContract` access to `user` funds."
              },
              "transferOwnership(address,bool,bool)": {
                "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
              },
              "whitelistMasterContract(address,bool)": {
                "notice": "Enables or disables a contract for approval without signed message."
              },
              "whitelistedMasterContracts(address)": {
                "notice": "masterContract to whitelisted state for approval without signed message"
              }
            },
            "version": 1
          }
        },
        "RebaseLibrary": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220a164bb00a63423083006e496e79a4a7a2329a9dfc7866c747203b3ce3e79261e64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG1 PUSH5 0xBB00A63423 ADDMOD ADDRESS MOD 0xE4 SWAP7 0xE7 SWAP11 0x4A PUSH27 0x2329A9DFC7866C747203B3CE3E79261E64736F6C634300060C0033 ",
              "sourceMap": "9649:3411:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220a164bb00a63423083006e496e79a4a7a2329a9dfc7866c747203b3ce3e79261e64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG1 PUSH5 0xBB00A63423 ADDMOD ADDRESS MOD 0xE4 SWAP7 0xE7 SWAP11 0x4A PUSH27 0x2329A9DFC7866C747203B3CE3E79261E64736F6C634300060C0033 ",
              "sourceMap": "9649:3411:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(struct Rebase memory,uint256,bool)": "infinite",
                "add(struct Rebase memory,uint256,uint256)": "infinite",
                "addElastic(struct Rebase storage pointer,uint256)": "infinite",
                "sub(struct Rebase memory,uint256,bool)": "infinite",
                "sub(struct Rebase memory,uint256,uint256)": "infinite",
                "subElastic(struct Rebase storage pointer,uint256)": "infinite",
                "toBase(struct Rebase memory,uint256,bool)": "infinite",
                "toElastic(struct Rebase memory,uint256,bool)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A rebasing library using overflow-/underflow-safe math.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/flat/BentoBoxV1Flat.sol\":\"RebaseLibrary\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/flat/BentoBoxV1Flat.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function decimals() external view returns (uint256);\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =\\n        keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest = keccak256(\\n                abi.encodePacked(\\n                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                    DOMAIN_SEPARATOR(),\\n                    keccak256(\\n                        abi.encode(\\n                            APPROVAL_SIGNATURE_HASH,\\n                            approved\\n                                ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                            user,\\n                            masterContract,\\n                            approved,\\n                            nonces[user]++\\n                        )\\n                    )\\n                )\\n            );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 0 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0x2b5ddc7584b8d6ec99d6cdf72523448b37509315f48d6d8383941f3eb9422812\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A rebasing library using overflow-/underflow-safe math.",
            "version": 1
          }
        }
      }
    },
    "sources": {
      "contracts/flat/BentoBoxV1Flat.sol": {
        "ast": {
          "absolutePath": "contracts/flat/BentoBoxV1Flat.sol",
          "exportedSymbols": {
            "BaseBoringBatchable": [
              1530
            ],
            "BentoBoxV1": [
              3106
            ],
            "BoringBatchable": [
              1566
            ],
            "BoringERC20": [
              260
            ],
            "BoringFactory": [
              1116
            ],
            "BoringMath": [
              412
            ],
            "BoringMath128": [
              458
            ],
            "BoringMath32": [
              550
            ],
            "BoringMath64": [
              504
            ],
            "BoringOwnable": [
              1031
            ],
            "BoringOwnableData": [
              908
            ],
            "IBatchFlashBorrower": [
              105
            ],
            "IERC20": [
              72
            ],
            "IFlashBorrower": [
              87
            ],
            "IMasterContract": [
              1038
            ],
            "IStrategy": [
              147
            ],
            "IWETH": [
              114
            ],
            "MasterContractManager": [
              1421
            ],
            "Rebase": [
              555
            ],
            "RebaseLibrary": [
              903
            ]
          },
          "id": 3107,
          "license": "UNLICENSED",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "891:23:0"
            },
            {
              "id": 2,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "915:33:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 72,
              "linearizedBaseContracts": [
                72
              ],
              "name": "IERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "18160ddd",
                  "id": 7,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1214:2:0"
                  },
                  "returnParameters": {
                    "id": 6,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7,
                        "src": "1240:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1240:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1239:9:0"
                  },
                  "scope": 72,
                  "src": "1194:55:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "70a08231",
                  "id": 14,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14,
                        "src": "1274:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1274:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1273:17:0"
                  },
                  "returnParameters": {
                    "id": 13,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14,
                        "src": "1314:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1314:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1313:9:0"
                  },
                  "scope": 72,
                  "src": "1255:68:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "dd62ed3e",
                  "id": 23,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "allowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23,
                        "src": "1348:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1348:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23,
                        "src": "1363:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1363:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1347:32:0"
                  },
                  "returnParameters": {
                    "id": 22,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23,
                        "src": "1403:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1403:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1402:9:0"
                  },
                  "scope": 72,
                  "src": "1329:83:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "095ea7b3",
                  "id": 32,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 28,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 32,
                        "src": "1435:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1435:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 27,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 32,
                        "src": "1452:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 26,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1452:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1434:33:0"
                  },
                  "returnParameters": {
                    "id": 31,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 30,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 32,
                        "src": "1486:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 29,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1486:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1485:6:0"
                  },
                  "scope": 72,
                  "src": "1418:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 40,
                  "name": "Transfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 39,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 34,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 40,
                        "src": "1513:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 33,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1513:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 36,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 40,
                        "src": "1535:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 35,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1535:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 38,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 40,
                        "src": "1555:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 37,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1555:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1512:57:0"
                  },
                  "src": "1498:72:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 48,
                  "name": "Approval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 47,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 42,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 48,
                        "src": "1590:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 41,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1590:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 44,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 48,
                        "src": "1613:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 43,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1613:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 46,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 48,
                        "src": "1638:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 45,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1638:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1589:63:0"
                  },
                  "src": "1575:78:0"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 49,
                    "nodeType": "StructuredDocumentation",
                    "src": "1659:20:0",
                    "text": "@notice EIP 2612"
                  },
                  "functionSelector": "d505accf",
                  "id": 66,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 64,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 51,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1709:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 50,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1709:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 53,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1732:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 52,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1732:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 55,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1757:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 54,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1757:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 57,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1780:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 56,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1780:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 59,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1806:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 58,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1806:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 61,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1823:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 60,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1823:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 63,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1842:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 62,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1842:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1699:158:0"
                  },
                  "returnParameters": {
                    "id": 65,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1866:0:0"
                  },
                  "scope": 72,
                  "src": "1684:183:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "313ce567",
                  "id": 71,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 67,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1890:2:0"
                  },
                  "returnParameters": {
                    "id": 70,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 69,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 71,
                        "src": "1916:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 68,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1916:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1915:9:0"
                  },
                  "scope": 72,
                  "src": "1873:52:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "1171:756:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 87,
              "linearizedBaseContracts": [
                87
              ],
              "name": "IFlashBorrower",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 73,
                    "nodeType": "StructuredDocumentation",
                    "src": "2032:475:0",
                    "text": "@notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\n @param sender The address of the invoker of this flashloan.\n @param token The address of the token that is loaned.\n @param amount of the `token` that is loaned.\n @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\n @param data Additional data that was passed to the flashloan function."
                  },
                  "functionSelector": "23e30c8b",
                  "id": 86,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 84,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 75,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 86,
                        "src": "2542:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 74,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2542:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 77,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 86,
                        "src": "2566:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 76,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "2566:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 79,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 86,
                        "src": "2588:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 78,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2588:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 81,
                        "mutability": "mutable",
                        "name": "fee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 86,
                        "src": "2612:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 80,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2612:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 83,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 86,
                        "src": "2633:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 82,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "2633:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2532:126:0"
                  },
                  "returnParameters": {
                    "id": 85,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2667:0:0"
                  },
                  "scope": 87,
                  "src": "2512:156:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "2001:669:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 105,
              "linearizedBaseContracts": [
                105
              ],
              "name": "IBatchFlashBorrower",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 88,
                    "nodeType": "StructuredDocumentation",
                    "src": "2708:535:0",
                    "text": "@notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\n @param sender The address of the invoker of this flashloan.\n @param tokens Array of addresses for ERC-20 tokens that is loaned.\n @param amounts A one-to-one map to `tokens` that is loaned.\n @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\n @param data Additional data that was passed to the flashloan function."
                  },
                  "functionSelector": "d9d17623",
                  "id": 104,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onBatchFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 102,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 90,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 104,
                        "src": "3283:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 89,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3283:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 93,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 104,
                        "src": "3307:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 91,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 72,
                            "src": "3307:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 92,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3307:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 96,
                        "mutability": "mutable",
                        "name": "amounts",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 104,
                        "src": "3341:26:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 94,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "3341:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 95,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3341:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 99,
                        "mutability": "mutable",
                        "name": "fees",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 104,
                        "src": "3377:23:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 97,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "3377:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 98,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3377:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 101,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 104,
                        "src": "3410:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 100,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3410:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3273:162:0"
                  },
                  "returnParameters": {
                    "id": 103,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3444:0:0"
                  },
                  "scope": 105,
                  "src": "3248:197:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "2672:775:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 114,
              "linearizedBaseContracts": [
                114
              ],
              "name": "IWETH",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d0e30db0",
                  "id": 108,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 106,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3554:2:0"
                  },
                  "returnParameters": {
                    "id": 107,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3573:0:0"
                  },
                  "scope": 114,
                  "src": "3538:36:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "2e1a7d4d",
                  "id": 113,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 111,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 110,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 113,
                        "src": "3598:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 109,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3598:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3597:9:0"
                  },
                  "returnParameters": {
                    "id": 112,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3615:0:0"
                  },
                  "scope": 114,
                  "src": "3580:36:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "3516:102:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 147,
              "linearizedBaseContracts": [
                147
              ],
              "name": "IStrategy",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 115,
                    "nodeType": "StructuredDocumentation",
                    "src": "3717:127:0",
                    "text": "@notice Send the assets to the Strategy and call skim to invest them.\n @param amount The amount of tokens to invest."
                  },
                  "functionSelector": "6939aaf5",
                  "id": 120,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "skim",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 118,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 117,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 120,
                        "src": "3863:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 116,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3863:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3862:16:0"
                  },
                  "returnParameters": {
                    "id": 119,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3887:0:0"
                  },
                  "scope": 147,
                  "src": "3849:39:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 121,
                    "nodeType": "StructuredDocumentation",
                    "src": "3894:372:0",
                    "text": "@notice Harvest any profits made converted to the asset and pass them to the caller.\n @param balance The amount of tokens the caller thinks it has invested.\n @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\n @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`."
                  },
                  "functionSelector": "18fccc76",
                  "id": 130,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "harvest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 126,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 123,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 130,
                        "src": "4288:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 122,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4288:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 125,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 130,
                        "src": "4305:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 124,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4305:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4287:33:0"
                  },
                  "returnParameters": {
                    "id": 129,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 128,
                        "mutability": "mutable",
                        "name": "amountAdded",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 130,
                        "src": "4339:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 127,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4339:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4338:20:0"
                  },
                  "scope": 147,
                  "src": "4271:88:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 131,
                    "nodeType": "StructuredDocumentation",
                    "src": "4365:395:0",
                    "text": "@notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\n @dev The `actualAmount` should be very close to the amount.\n The difference should NOT be used to report a loss. That's what harvest is for.\n @param amount The requested amount the caller wants to withdraw.\n @return actualAmount The real amount that is withdrawn."
                  },
                  "functionSelector": "2e1a7d4d",
                  "id": 138,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 134,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 133,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 138,
                        "src": "4783:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 132,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4783:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4782:16:0"
                  },
                  "returnParameters": {
                    "id": 137,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 136,
                        "mutability": "mutable",
                        "name": "actualAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 138,
                        "src": "4817:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 135,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4817:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4816:22:0"
                  },
                  "scope": 147,
                  "src": "4765:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 139,
                    "nodeType": "StructuredDocumentation",
                    "src": "4845:255:0",
                    "text": "@notice Withdraw all assets in the safest way possible. This shouldn't fail.\n @param balance The amount of tokens the caller thinks it has invested.\n @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`."
                  },
                  "functionSelector": "7f8661a1",
                  "id": 146,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "exit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 142,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 141,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 146,
                        "src": "5119:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 140,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5119:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5118:17:0"
                  },
                  "returnParameters": {
                    "id": 145,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 144,
                        "mutability": "mutable",
                        "name": "amountAdded",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 146,
                        "src": "5154:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 143,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5154:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5153:20:0"
                  },
                  "scope": 147,
                  "src": "5105:69:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "3691:1485:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 260,
              "linearizedBaseContracts": [
                260
              ],
              "name": "BoringERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 150,
                  "mutability": "constant",
                  "name": "SIG_SYMBOL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 260,
                  "src": "5313:47:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 148,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5313:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783935643839623431",
                    "id": 149,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5350:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2514000705_by_1",
                      "typeString": "int_const 2514000705"
                    },
                    "value": "0x95d89b41"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 153,
                  "mutability": "constant",
                  "name": "SIG_NAME",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 260,
                  "src": "5378:45:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 151,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5378:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783036666464653033",
                    "id": 152,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5413:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_117300739_by_1",
                      "typeString": "int_const 117300739"
                    },
                    "value": "0x06fdde03"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 156,
                  "mutability": "constant",
                  "name": "SIG_DECIMALS",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 260,
                  "src": "5439:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 154,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5439:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783331336365353637",
                    "id": 155,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5478:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_826074471_by_1",
                      "typeString": "int_const 826074471"
                    },
                    "value": "0x313ce567"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 159,
                  "mutability": "constant",
                  "name": "SIG_TRANSFER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 260,
                  "src": "5508:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 157,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5508:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30786139303539636262",
                    "id": 158,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5547:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2835717307_by_1",
                      "typeString": "int_const 2835717307"
                    },
                    "value": "0xa9059cbb"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 162,
                  "mutability": "constant",
                  "name": "SIG_TRANSFER_FROM",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 260,
                  "src": "5592:54:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 160,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5592:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783233623837326464",
                    "id": 161,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5636:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_599290589_by_1",
                      "typeString": "int_const 599290589"
                    },
                    "value": "0x23b872dd"
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 208,
                    "nodeType": "Block",
                    "src": "6060:230:0",
                    "statements": [
                      {
                        "assignments": [
                          173,
                          175
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 173,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 208,
                            "src": "6071:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 172,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "6071:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 175,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 208,
                            "src": "6085:17:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 174,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "6085:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 188,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 183,
                                  "name": "SIG_TRANSFER",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 159,
                                  "src": "6149:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 184,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 167,
                                  "src": "6163:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 185,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 169,
                                  "src": "6167:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 181,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6126:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 182,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6126:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 186,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6126:48:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 178,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 165,
                                  "src": "6114:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 177,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6106:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 176,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6106:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 179,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6106:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 180,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "call",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "6106:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 187,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6106:69:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6070:105:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 204,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 190,
                                "name": "success",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 173,
                                "src": "6193:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 202,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 194,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 191,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 175,
                                          "src": "6205:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        "id": 192,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "length",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6205:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 193,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "6220:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "6205:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 197,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 175,
                                          "src": "6236:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "components": [
                                            {
                                              "argumentTypes": null,
                                              "id": 199,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "6243:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_bool_$",
                                                "typeString": "type(bool)"
                                              },
                                              "typeName": {
                                                "id": 198,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "6243:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            }
                                          ],
                                          "id": 200,
                                          "isConstant": false,
                                          "isInlineArray": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "TupleExpression",
                                          "src": "6242:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          },
                                          {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 195,
                                          "name": "abi",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -1,
                                          "src": "6225:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_abi",
                                            "typeString": "abi"
                                          }
                                        },
                                        "id": 196,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "decode",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6225:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                          "typeString": "function () pure"
                                        }
                                      },
                                      "id": 201,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6225:24:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "6205:44:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 203,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "6204:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "6193:57:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e6745524332303a205472616e73666572206661696c6564",
                              "id": 205,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6252:30:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1a3f0851ddc9e157ae96e52ed9dfd71a8cb4b1cf2a73b26b9f3f9e0aa9469d27",
                                "typeString": "literal_string \"BoringERC20: Transfer failed\""
                              },
                              "value": "BoringERC20: Transfer failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1a3f0851ddc9e157ae96e52ed9dfd71a8cb4b1cf2a73b26b9f3f9e0aa9469d27",
                                "typeString": "literal_string \"BoringERC20: Transfer failed\""
                              }
                            ],
                            "id": 189,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6185:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 206,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6185:98:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 207,
                        "nodeType": "ExpressionStatement",
                        "src": "6185:98:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 163,
                    "nodeType": "StructuredDocumentation",
                    "src": "5694:258:0",
                    "text": "@notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\n Reverts on a failed transfer.\n @param token The address of the ERC-20 token.\n @param to Transfer tokens to.\n @param amount The token amount."
                  },
                  "id": 209,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 170,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 165,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 209,
                        "src": "5988:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 164,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "5988:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 167,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 209,
                        "src": "6010:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 166,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6010:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 169,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 209,
                        "src": "6030:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 168,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6030:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5978:72:0"
                  },
                  "returnParameters": {
                    "id": 171,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6060:0:0"
                  },
                  "scope": 260,
                  "src": "5957:333:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 258,
                    "nodeType": "Block",
                    "src": "6734:245:0",
                    "statements": [
                      {
                        "assignments": [
                          222,
                          224
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 222,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 258,
                            "src": "6745:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 221,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "6745:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 224,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 258,
                            "src": "6759:17:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 223,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "6759:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 238,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 232,
                                  "name": "SIG_TRANSFER_FROM",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 162,
                                  "src": "6823:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 233,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 214,
                                  "src": "6842:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 234,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 216,
                                  "src": "6848:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 235,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 218,
                                  "src": "6852:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 230,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6800:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 231,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6800:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 236,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6800:59:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 227,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 212,
                                  "src": "6788:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 226,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6780:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 225,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6780:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 228,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6780:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 229,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "call",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "6780:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 237,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6780:80:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6744:116:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 254,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 240,
                                "name": "success",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 222,
                                "src": "6878:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 252,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 244,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 241,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 224,
                                          "src": "6890:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        "id": 242,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "length",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6890:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 243,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "6905:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "6890:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 247,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 224,
                                          "src": "6921:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "components": [
                                            {
                                              "argumentTypes": null,
                                              "id": 249,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "6928:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_bool_$",
                                                "typeString": "type(bool)"
                                              },
                                              "typeName": {
                                                "id": 248,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "6928:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            }
                                          ],
                                          "id": 250,
                                          "isConstant": false,
                                          "isInlineArray": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "TupleExpression",
                                          "src": "6927:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          },
                                          {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 245,
                                          "name": "abi",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -1,
                                          "src": "6910:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_abi",
                                            "typeString": "abi"
                                          }
                                        },
                                        "id": 246,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "decode",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6910:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                          "typeString": "function () pure"
                                        }
                                      },
                                      "id": 251,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6910:24:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "6890:44:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 253,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "6889:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "6878:57:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e6745524332303a205472616e7366657246726f6d206661696c6564",
                              "id": 255,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6937:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_dffd2f381f9235cb5927387124071d63a91c90f587c3edae76629d7dc4794f26",
                                "typeString": "literal_string \"BoringERC20: TransferFrom failed\""
                              },
                              "value": "BoringERC20: TransferFrom failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_dffd2f381f9235cb5927387124071d63a91c90f587c3edae76629d7dc4794f26",
                                "typeString": "literal_string \"BoringERC20: TransferFrom failed\""
                              }
                            ],
                            "id": 239,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6870:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 256,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6870:102:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 257,
                        "nodeType": "ExpressionStatement",
                        "src": "6870:102:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 210,
                    "nodeType": "StructuredDocumentation",
                    "src": "6296:304:0",
                    "text": "@notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\n Reverts on a failed transfer.\n @param token The address of the ERC-20 token.\n @param from Transfer tokens from.\n @param to Transfer tokens to.\n @param amount The token amount."
                  },
                  "id": 259,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 219,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 212,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 259,
                        "src": "6640:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 211,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "6640:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 214,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 259,
                        "src": "6662:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 213,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6662:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 216,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 259,
                        "src": "6684:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 215,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6684:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 218,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 259,
                        "src": "6704:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 217,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6704:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6630:94:0"
                  },
                  "returnParameters": {
                    "id": 220,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6734:0:0"
                  },
                  "scope": 260,
                  "src": "6605:374:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3107,
              "src": "5287:1694:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 261,
                "nodeType": "StructuredDocumentation",
                "src": "7091:151:0",
                "text": "@notice A library for performing overflow-/underflow-safe math,\n updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)."
              },
              "fullyImplemented": true,
              "id": 412,
              "linearizedBaseContracts": [
                412
              ],
              "name": "BoringMath",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 282,
                    "nodeType": "Block",
                    "src": "7336:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 278,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 275,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 271,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 268,
                                      "src": "7355:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 274,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 272,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 263,
                                        "src": "7359:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 273,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 265,
                                        "src": "7363:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "7359:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "7355:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "id": 276,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "7354:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 277,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 265,
                                "src": "7369:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "7354:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 279,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7372:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 270,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7346:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 280,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7346:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 281,
                        "nodeType": "ExpressionStatement",
                        "src": "7346:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 283,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 266,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 263,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 283,
                        "src": "7280:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 262,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7280:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 265,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 283,
                        "src": "7291:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 264,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7291:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7279:22:0"
                  },
                  "returnParameters": {
                    "id": 269,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 268,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 283,
                        "src": "7325:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 267,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7325:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7324:11:0"
                  },
                  "scope": 412,
                  "src": "7267:139:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 304,
                    "nodeType": "Block",
                    "src": "7481:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 300,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 297,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 293,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 290,
                                      "src": "7500:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 296,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 294,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 285,
                                        "src": "7504:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 295,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 287,
                                        "src": "7508:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "7504:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "7500:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "id": 298,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "7499:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 299,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 285,
                                "src": "7514:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "7499:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 301,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7517:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 292,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7491:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 302,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7491:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 303,
                        "nodeType": "ExpressionStatement",
                        "src": "7491:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 305,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 288,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 285,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 305,
                        "src": "7425:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 284,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7425:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 287,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 305,
                        "src": "7436:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 286,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7436:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7424:22:0"
                  },
                  "returnParameters": {
                    "id": 291,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 290,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 305,
                        "src": "7470:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 289,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7470:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7469:11:0"
                  },
                  "scope": 412,
                  "src": "7412:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 332,
                    "nodeType": "Block",
                    "src": "7623:84:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 328,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 317,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 315,
                                  "name": "b",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 309,
                                  "src": "7641:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 316,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7646:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "7641:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 327,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 325,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "id": 322,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "id": 318,
                                          "name": "c",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 312,
                                          "src": "7652:1:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 321,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 319,
                                            "name": "a",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 307,
                                            "src": "7656:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "*",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 320,
                                            "name": "b",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 309,
                                            "src": "7660:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "7656:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "7652:9:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 323,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "7651:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 324,
                                    "name": "b",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 309,
                                    "src": "7665:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "7651:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 326,
                                  "name": "a",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 307,
                                  "src": "7670:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "7651:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "7641:30:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a204d756c204f766572666c6f77",
                              "id": 329,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7673:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_efa2024ddfa13946089ac6325359d421926f574cb871587fa659a82734fa675e",
                                "typeString": "literal_string \"BoringMath: Mul Overflow\""
                              },
                              "value": "BoringMath: Mul Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_efa2024ddfa13946089ac6325359d421926f574cb871587fa659a82734fa675e",
                                "typeString": "literal_string \"BoringMath: Mul Overflow\""
                              }
                            ],
                            "id": 314,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7633:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 330,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7633:67:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 331,
                        "nodeType": "ExpressionStatement",
                        "src": "7633:67:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 333,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 310,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 307,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 333,
                        "src": "7567:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 306,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7567:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 309,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 333,
                        "src": "7578:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 308,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7578:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7566:22:0"
                  },
                  "returnParameters": {
                    "id": 313,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 312,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 333,
                        "src": "7612:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 311,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7612:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7611:11:0"
                  },
                  "scope": 412,
                  "src": "7554:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 358,
                    "nodeType": "Block",
                    "src": "7773:98:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 347,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 341,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 335,
                                "src": "7791:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 345,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "7804:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 344,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "7805:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  ],
                                  "id": 343,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "7796:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint128_$",
                                    "typeString": "type(uint128)"
                                  },
                                  "typeName": {
                                    "id": 342,
                                    "name": "uint128",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7796:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 346,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7796:11:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "7791:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e74313238204f766572666c6f77",
                              "id": 348,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7809:30:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_64196137e15a5be4f7488ecfa918cfa26a6c2051ae3fb739c5de9bf8431fe9a5",
                                "typeString": "literal_string \"BoringMath: uint128 Overflow\""
                              },
                              "value": "BoringMath: uint128 Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_64196137e15a5be4f7488ecfa918cfa26a6c2051ae3fb739c5de9bf8431fe9a5",
                                "typeString": "literal_string \"BoringMath: uint128 Overflow\""
                              }
                            ],
                            "id": 340,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7783:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 349,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7783:57:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 350,
                        "nodeType": "ExpressionStatement",
                        "src": "7783:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 356,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 351,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 338,
                            "src": "7850:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 354,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 335,
                                "src": "7862:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 353,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "7854:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint128_$",
                                "typeString": "type(uint128)"
                              },
                              "typeName": {
                                "id": 352,
                                "name": "uint128",
                                "nodeType": "ElementaryTypeName",
                                "src": "7854:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 355,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7854:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "7850:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 357,
                        "nodeType": "ExpressionStatement",
                        "src": "7850:14:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 359,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to128",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 336,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 335,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 359,
                        "src": "7728:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 334,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7728:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7727:11:0"
                  },
                  "returnParameters": {
                    "id": 339,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 338,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 359,
                        "src": "7762:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 337,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "7762:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7761:11:0"
                  },
                  "scope": 412,
                  "src": "7713:158:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 384,
                    "nodeType": "Block",
                    "src": "7935:95:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 373,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 367,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 361,
                                "src": "7953:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 371,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "7965:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 370,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "7966:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  ],
                                  "id": 369,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "7958:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint64_$",
                                    "typeString": "type(uint64)"
                                  },
                                  "typeName": {
                                    "id": 368,
                                    "name": "uint64",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7958:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 372,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7958:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "src": "7953:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e743634204f766572666c6f77",
                              "id": 374,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7970:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b3c33265b589f76cafa7df00c0a28addc9a2c2003a13a1e0e4b875f58eb08764",
                                "typeString": "literal_string \"BoringMath: uint64 Overflow\""
                              },
                              "value": "BoringMath: uint64 Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b3c33265b589f76cafa7df00c0a28addc9a2c2003a13a1e0e4b875f58eb08764",
                                "typeString": "literal_string \"BoringMath: uint64 Overflow\""
                              }
                            ],
                            "id": 366,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7945:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 375,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7945:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 376,
                        "nodeType": "ExpressionStatement",
                        "src": "7945:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 382,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 377,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 364,
                            "src": "8010:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 380,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 361,
                                "src": "8021:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 379,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "8014:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 378,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "8014:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 381,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8014:9:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "8010:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "id": 383,
                        "nodeType": "ExpressionStatement",
                        "src": "8010:13:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 385,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to64",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 362,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 361,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 385,
                        "src": "7891:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 360,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7891:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7890:11:0"
                  },
                  "returnParameters": {
                    "id": 365,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 364,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 385,
                        "src": "7925:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 363,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "7925:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7924:10:0"
                  },
                  "scope": 412,
                  "src": "7877:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 410,
                    "nodeType": "Block",
                    "src": "8094:95:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 399,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 393,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 387,
                                "src": "8112:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 397,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "8124:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 396,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "8125:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  ],
                                  "id": 395,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "8117:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint32_$",
                                    "typeString": "type(uint32)"
                                  },
                                  "typeName": {
                                    "id": 394,
                                    "name": "uint32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8117:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 398,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8117:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "src": "8112:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e743332204f766572666c6f77",
                              "id": 400,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8129:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d8918cd18a3e78dc3bd01c63d310640381efda31e2d3ce751014519bc65013fc",
                                "typeString": "literal_string \"BoringMath: uint32 Overflow\""
                              },
                              "value": "BoringMath: uint32 Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d8918cd18a3e78dc3bd01c63d310640381efda31e2d3ce751014519bc65013fc",
                                "typeString": "literal_string \"BoringMath: uint32 Overflow\""
                              }
                            ],
                            "id": 392,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8104:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 401,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8104:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 402,
                        "nodeType": "ExpressionStatement",
                        "src": "8104:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 408,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 403,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 390,
                            "src": "8169:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 406,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 387,
                                "src": "8180:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 405,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "8173:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint32_$",
                                "typeString": "type(uint32)"
                              },
                              "typeName": {
                                "id": 404,
                                "name": "uint32",
                                "nodeType": "ElementaryTypeName",
                                "src": "8173:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 407,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8173:9:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "8169:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 409,
                        "nodeType": "ExpressionStatement",
                        "src": "8169:13:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 411,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to32",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 388,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 387,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 411,
                        "src": "8050:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 386,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8050:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8049:11:0"
                  },
                  "returnParameters": {
                    "id": 391,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 390,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 411,
                        "src": "8084:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 389,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "8084:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8083:10:0"
                  },
                  "scope": 412,
                  "src": "8036:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3107,
              "src": "7242:949:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 413,
                "nodeType": "StructuredDocumentation",
                "src": "8193:99:0",
                "text": "@notice A library for performing overflow-/underflow-safe addition and subtraction on uint128."
              },
              "fullyImplemented": true,
              "id": 458,
              "linearizedBaseContracts": [
                458
              ],
              "name": "BoringMath128",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 434,
                    "nodeType": "Block",
                    "src": "8389:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 430,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 427,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 423,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 420,
                                      "src": "8408:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      },
                                      "id": 426,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 424,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 415,
                                        "src": "8412:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 425,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 417,
                                        "src": "8416:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "8412:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "8408:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "id": 428,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8407:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 429,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 417,
                                "src": "8422:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "8407:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 431,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8425:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 422,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8399:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 432,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8399:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 433,
                        "nodeType": "ExpressionStatement",
                        "src": "8399:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 435,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 418,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 415,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 435,
                        "src": "8333:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 414,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8333:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 417,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 435,
                        "src": "8344:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 416,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8344:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8332:22:0"
                  },
                  "returnParameters": {
                    "id": 421,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 420,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 435,
                        "src": "8378:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 419,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8378:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8377:11:0"
                  },
                  "scope": 458,
                  "src": "8320:139:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 456,
                    "nodeType": "Block",
                    "src": "8534:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 452,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 449,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 445,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 442,
                                      "src": "8553:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      },
                                      "id": 448,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 446,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 437,
                                        "src": "8557:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 447,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 439,
                                        "src": "8561:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "8557:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "8553:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "id": 450,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8552:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 451,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 437,
                                "src": "8567:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "8552:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 453,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8570:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 444,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8544:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 454,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8544:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 455,
                        "nodeType": "ExpressionStatement",
                        "src": "8544:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 457,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 440,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 437,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 457,
                        "src": "8478:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 436,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8478:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 439,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 457,
                        "src": "8489:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 438,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8489:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8477:22:0"
                  },
                  "returnParameters": {
                    "id": 443,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 442,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 457,
                        "src": "8523:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 441,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8523:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8522:11:0"
                  },
                  "scope": 458,
                  "src": "8465:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3107,
              "src": "8292:311:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 459,
                "nodeType": "StructuredDocumentation",
                "src": "8605:98:0",
                "text": "@notice A library for performing overflow-/underflow-safe addition and subtraction on uint64."
              },
              "fullyImplemented": true,
              "id": 504,
              "linearizedBaseContracts": [
                504
              ],
              "name": "BoringMath64",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 480,
                    "nodeType": "Block",
                    "src": "8796:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              },
                              "id": 476,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 473,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 469,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 466,
                                      "src": "8815:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      },
                                      "id": 472,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 470,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 461,
                                        "src": "8819:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 471,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 463,
                                        "src": "8823:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "8819:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "src": "8815:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint64",
                                      "typeString": "uint64"
                                    }
                                  }
                                ],
                                "id": 474,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8814:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 475,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 463,
                                "src": "8829:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "src": "8814:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 477,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8832:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 468,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8806:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 478,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8806:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 479,
                        "nodeType": "ExpressionStatement",
                        "src": "8806:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 481,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 464,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 461,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 481,
                        "src": "8743:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 460,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8743:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 463,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 481,
                        "src": "8753:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 462,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8753:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8742:20:0"
                  },
                  "returnParameters": {
                    "id": 467,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 466,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 481,
                        "src": "8786:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 465,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8786:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8785:10:0"
                  },
                  "scope": 504,
                  "src": "8730:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 502,
                    "nodeType": "Block",
                    "src": "8938:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              },
                              "id": 498,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 495,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 491,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 488,
                                      "src": "8957:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      },
                                      "id": 494,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 492,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 483,
                                        "src": "8961:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 493,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 485,
                                        "src": "8965:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "8961:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "src": "8957:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint64",
                                      "typeString": "uint64"
                                    }
                                  }
                                ],
                                "id": 496,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8956:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 497,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 483,
                                "src": "8971:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "src": "8956:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 499,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8974:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 490,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8948:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 500,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8948:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 501,
                        "nodeType": "ExpressionStatement",
                        "src": "8948:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 503,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 486,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 483,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 503,
                        "src": "8885:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 482,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8885:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 485,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 503,
                        "src": "8895:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 484,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8895:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8884:20:0"
                  },
                  "returnParameters": {
                    "id": 489,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 488,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 503,
                        "src": "8928:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 487,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8928:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8927:10:0"
                  },
                  "scope": 504,
                  "src": "8872:133:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3107,
              "src": "8703:304:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 505,
                "nodeType": "StructuredDocumentation",
                "src": "9009:98:0",
                "text": "@notice A library for performing overflow-/underflow-safe addition and subtraction on uint32."
              },
              "fullyImplemented": true,
              "id": 550,
              "linearizedBaseContracts": [
                550
              ],
              "name": "BoringMath32",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 526,
                    "nodeType": "Block",
                    "src": "9200:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              "id": 522,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 519,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 515,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 512,
                                      "src": "9219:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      },
                                      "id": 518,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 516,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 507,
                                        "src": "9223:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 517,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 509,
                                        "src": "9227:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "src": "9223:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "src": "9219:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint32",
                                      "typeString": "uint32"
                                    }
                                  }
                                ],
                                "id": 520,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "9218:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 521,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 509,
                                "src": "9233:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "src": "9218:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 523,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9236:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 514,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9210:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 524,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9210:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 525,
                        "nodeType": "ExpressionStatement",
                        "src": "9210:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 527,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 510,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 507,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 527,
                        "src": "9147:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 506,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9147:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 509,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 527,
                        "src": "9157:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 508,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9157:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9146:20:0"
                  },
                  "returnParameters": {
                    "id": 513,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 512,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 527,
                        "src": "9190:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 511,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9190:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9189:10:0"
                  },
                  "scope": 550,
                  "src": "9134:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 548,
                    "nodeType": "Block",
                    "src": "9342:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              "id": 544,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 541,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 537,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 534,
                                      "src": "9361:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      },
                                      "id": 540,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 538,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 529,
                                        "src": "9365:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 539,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 531,
                                        "src": "9369:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "src": "9365:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "src": "9361:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint32",
                                      "typeString": "uint32"
                                    }
                                  }
                                ],
                                "id": 542,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "9360:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 543,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 529,
                                "src": "9375:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "src": "9360:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 545,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9378:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 536,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9352:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 546,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9352:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 547,
                        "nodeType": "ExpressionStatement",
                        "src": "9352:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 549,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 532,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 529,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 549,
                        "src": "9289:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 528,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9289:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 531,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 549,
                        "src": "9299:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 530,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9299:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9288:20:0"
                  },
                  "returnParameters": {
                    "id": 535,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 534,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 549,
                        "src": "9332:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 533,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9332:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9331:10:0"
                  },
                  "scope": 550,
                  "src": "9276:133:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3107,
              "src": "9107:304:0"
            },
            {
              "canonicalName": "Rebase",
              "id": 555,
              "members": [
                {
                  "constant": false,
                  "id": 552,
                  "mutability": "mutable",
                  "name": "elastic",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 555,
                  "src": "9543:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 551,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "9543:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 554,
                  "mutability": "mutable",
                  "name": "base",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 555,
                  "src": "9564:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 553,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "9564:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "name": "Rebase",
              "nodeType": "StructDefinition",
              "scope": 3107,
              "src": "9523:56:0",
              "visibility": "public"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 556,
                "nodeType": "StructuredDocumentation",
                "src": "9581:68:0",
                "text": "@notice A rebasing library using overflow-/underflow-safe math."
              },
              "fullyImplemented": true,
              "id": 903,
              "linearizedBaseContracts": [
                903
              ],
              "name": "RebaseLibrary",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 559,
                  "libraryName": {
                    "contractScope": null,
                    "id": 557,
                    "name": "BoringMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 412,
                    "src": "9683:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath_$412",
                      "typeString": "library BoringMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "9677:29:0",
                  "typeName": {
                    "id": 558,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9698:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 562,
                  "libraryName": {
                    "contractScope": null,
                    "id": 560,
                    "name": "BoringMath128",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 458,
                    "src": "9717:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath128_$458",
                      "typeString": "library BoringMath128"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "9711:32:0",
                  "typeName": {
                    "id": 561,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "9735:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  }
                },
                {
                  "body": {
                    "id": 617,
                    "nodeType": "Block",
                    "src": "9968:283:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 577,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 574,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 565,
                              "src": "9982:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 575,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 552,
                            "src": "9982:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 576,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "9999:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "9982:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 615,
                          "nodeType": "Block",
                          "src": "10047:198:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 592,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 583,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 572,
                                  "src": "10061:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 591,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 586,
                                          "name": "total",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 565,
                                          "src": "10080:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 587,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "base",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 554,
                                        "src": "10080:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 584,
                                        "name": "elastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 567,
                                        "src": "10068:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 585,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 333,
                                      "src": "10068:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 588,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "10068:23:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 589,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 565,
                                      "src": "10094:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 590,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "elastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 552,
                                    "src": "10094:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "10068:39:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10061:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 593,
                              "nodeType": "ExpressionStatement",
                              "src": "10061:46:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 605,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 594,
                                  "name": "roundUp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 569,
                                  "src": "10125:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 604,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 602,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 597,
                                            "name": "total",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 565,
                                            "src": "10145:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                              "typeString": "struct Rebase memory"
                                            }
                                          },
                                          "id": 598,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "elastic",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 552,
                                          "src": "10145:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 595,
                                          "name": "base",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 572,
                                          "src": "10136:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 596,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 333,
                                        "src": "10136:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 599,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "10136:23:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "/",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 600,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 565,
                                        "src": "10162:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 601,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "base",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 554,
                                      "src": "10162:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "10136:36:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 603,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 567,
                                    "src": "10175:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "10136:46:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "10125:57:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 614,
                              "nodeType": "IfStatement",
                              "src": "10121:114:0",
                              "trueBody": {
                                "id": 613,
                                "nodeType": "Block",
                                "src": "10184:51:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 611,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 606,
                                        "name": "base",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 572,
                                        "src": "10202:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 609,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "10218:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            },
                                            "value": "1"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 607,
                                            "name": "base",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 572,
                                            "src": "10209:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 608,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 283,
                                          "src": "10209:8:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 610,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "10209:11:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "10202:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 612,
                                    "nodeType": "ExpressionStatement",
                                    "src": "10202:18:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 616,
                        "nodeType": "IfStatement",
                        "src": "9978:267:0",
                        "trueBody": {
                          "id": 582,
                          "nodeType": "Block",
                          "src": "10002:39:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 580,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 578,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 572,
                                  "src": "10016:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 579,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 567,
                                  "src": "10023:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10016:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 581,
                              "nodeType": "ExpressionStatement",
                              "src": "10016:14:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 563,
                    "nodeType": "StructuredDocumentation",
                    "src": "9749:79:0",
                    "text": "@notice Calculates the base value in relationship to `elastic` and `total`."
                  },
                  "id": 618,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toBase",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 570,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 565,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 618,
                        "src": "9858:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 564,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "9858:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 567,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 618,
                        "src": "9887:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 566,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9887:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 569,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 618,
                        "src": "9912:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 568,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "9912:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9848:82:0"
                  },
                  "returnParameters": {
                    "id": 573,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 572,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 618,
                        "src": "9954:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 571,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9954:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9953:14:0"
                  },
                  "scope": 903,
                  "src": "9833:418:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 673,
                    "nodeType": "Block",
                    "src": "10479:286:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 633,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 630,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 621,
                              "src": "10493:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 631,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 554,
                            "src": "10493:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 632,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "10507:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "10493:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 671,
                          "nodeType": "Block",
                          "src": "10555:204:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 648,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 639,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 628,
                                  "src": "10569:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 647,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 642,
                                          "name": "total",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 621,
                                          "src": "10588:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 643,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "elastic",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 552,
                                        "src": "10588:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 640,
                                        "name": "base",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 623,
                                        "src": "10579:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 641,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 333,
                                      "src": "10579:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 644,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "10579:23:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 645,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 621,
                                      "src": "10605:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 646,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "base",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 554,
                                    "src": "10605:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "10579:36:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10569:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 649,
                              "nodeType": "ExpressionStatement",
                              "src": "10569:46:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 661,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 650,
                                  "name": "roundUp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 625,
                                  "src": "10633:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 660,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 658,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 653,
                                            "name": "total",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 621,
                                            "src": "10656:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                              "typeString": "struct Rebase memory"
                                            }
                                          },
                                          "id": 654,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "base",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 554,
                                          "src": "10656:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 651,
                                          "name": "elastic",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 628,
                                          "src": "10644:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 652,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 333,
                                        "src": "10644:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 655,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "10644:23:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "/",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 656,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 621,
                                        "src": "10670:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 657,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 552,
                                      "src": "10670:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "10644:39:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 659,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 623,
                                    "src": "10686:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "10644:46:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "10633:57:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 670,
                              "nodeType": "IfStatement",
                              "src": "10629:120:0",
                              "trueBody": {
                                "id": 669,
                                "nodeType": "Block",
                                "src": "10692:57:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 667,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 662,
                                        "name": "elastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 628,
                                        "src": "10710:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 665,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "10732:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            },
                                            "value": "1"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 663,
                                            "name": "elastic",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 628,
                                            "src": "10720:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 664,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 283,
                                          "src": "10720:11:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 666,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "10720:14:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "10710:24:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 668,
                                    "nodeType": "ExpressionStatement",
                                    "src": "10710:24:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 672,
                        "nodeType": "IfStatement",
                        "src": "10489:270:0",
                        "trueBody": {
                          "id": 638,
                          "nodeType": "Block",
                          "src": "10510:39:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 636,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 634,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 628,
                                  "src": "10524:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 635,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 623,
                                  "src": "10534:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10524:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 637,
                              "nodeType": "ExpressionStatement",
                              "src": "10524:14:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 619,
                    "nodeType": "StructuredDocumentation",
                    "src": "10257:79:0",
                    "text": "@notice Calculates the elastic value in relationship to `base` and `total`."
                  },
                  "id": 674,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toElastic",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 626,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 621,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 674,
                        "src": "10369:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 620,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "10369:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 623,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 674,
                        "src": "10398:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 622,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10398:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 625,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 674,
                        "src": "10420:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 624,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10420:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10359:79:0"
                  },
                  "returnParameters": {
                    "id": 629,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 628,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 674,
                        "src": "10462:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 627,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10462:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10461:17:0"
                  },
                  "scope": 903,
                  "src": "10341:424:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 724,
                    "nodeType": "Block",
                    "src": "11076:196:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 694,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 688,
                            "name": "base",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 686,
                            "src": "11086:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 690,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 677,
                                "src": "11100:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 691,
                                "name": "elastic",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 679,
                                "src": "11107:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 692,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 681,
                                "src": "11116:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "id": 689,
                              "name": "toBase",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 618,
                              "src": "11093:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 693,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11093:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11086:38:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 695,
                        "nodeType": "ExpressionStatement",
                        "src": "11086:38:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 706,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 696,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 677,
                              "src": "11134:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 698,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 552,
                            "src": "11134:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 702,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 679,
                                    "src": "11168:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 703,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "11168:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 704,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11168:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 699,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 677,
                                  "src": "11150:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 700,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 552,
                                "src": "11150:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 701,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 435,
                              "src": "11150:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 705,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11150:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11134:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 707,
                        "nodeType": "ExpressionStatement",
                        "src": "11134:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 718,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 708,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 677,
                              "src": "11194:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 710,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 554,
                            "src": "11194:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 714,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 686,
                                    "src": "11222:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 715,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "11222:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 716,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11222:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 711,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 677,
                                  "src": "11207:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 712,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 554,
                                "src": "11207:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 713,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 435,
                              "src": "11207:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 717,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11207:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11194:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 719,
                        "nodeType": "ExpressionStatement",
                        "src": "11194:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 720,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 677,
                              "src": "11253:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 721,
                              "name": "base",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 686,
                              "src": "11260:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 722,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11252:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$",
                            "typeString": "tuple(struct Rebase memory,uint256)"
                          }
                        },
                        "functionReturnParameters": 687,
                        "id": 723,
                        "nodeType": "Return",
                        "src": "11245:20:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 675,
                    "nodeType": "StructuredDocumentation",
                    "src": "10771:153:0",
                    "text": "@notice Add `elastic` to `total` and doubles `total.base`.\n @return (Rebase) The new total.\n @return base in relationship to `elastic`."
                  },
                  "id": 725,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 682,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 677,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 725,
                        "src": "10951:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 676,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "10951:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 679,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 725,
                        "src": "10980:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 678,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10980:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 681,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 725,
                        "src": "11005:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 680,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11005:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10941:82:0"
                  },
                  "returnParameters": {
                    "id": 687,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 684,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 725,
                        "src": "11047:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 683,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "11047:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 686,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 725,
                        "src": "11062:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 685,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11062:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11046:29:0"
                  },
                  "scope": 903,
                  "src": "10929:343:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 775,
                    "nodeType": "Block",
                    "src": "11584:202:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 745,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 739,
                            "name": "elastic",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 737,
                            "src": "11594:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 741,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 728,
                                "src": "11614:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 742,
                                "name": "base",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 730,
                                "src": "11621:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 743,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 732,
                                "src": "11627:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "id": 740,
                              "name": "toElastic",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 674,
                              "src": "11604:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 744,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11604:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11594:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 746,
                        "nodeType": "ExpressionStatement",
                        "src": "11594:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 757,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 747,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 728,
                              "src": "11645:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 749,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 552,
                            "src": "11645:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 753,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 737,
                                    "src": "11679:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 754,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "11679:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 755,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11679:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 750,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 728,
                                  "src": "11661:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 751,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 552,
                                "src": "11661:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 752,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 457,
                              "src": "11661:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 756,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11661:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11645:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 758,
                        "nodeType": "ExpressionStatement",
                        "src": "11645:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 769,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 759,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 728,
                              "src": "11705:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 761,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 554,
                            "src": "11705:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 765,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 730,
                                    "src": "11733:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 766,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "11733:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 767,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11733:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 762,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 728,
                                  "src": "11718:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 763,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 554,
                                "src": "11718:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 764,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 457,
                              "src": "11718:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 768,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11718:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11705:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 770,
                        "nodeType": "ExpressionStatement",
                        "src": "11705:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 771,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 728,
                              "src": "11764:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 772,
                              "name": "elastic",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 737,
                              "src": "11771:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 773,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11763:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$",
                            "typeString": "tuple(struct Rebase memory,uint256)"
                          }
                        },
                        "functionReturnParameters": 738,
                        "id": 774,
                        "nodeType": "Return",
                        "src": "11756:23:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 726,
                    "nodeType": "StructuredDocumentation",
                    "src": "11278:154:0",
                    "text": "@notice Sub `base` from `total` and update `total.elastic`.\n @return (Rebase) The new total.\n @return elastic in relationship to `base`."
                  },
                  "id": 776,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 733,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 728,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 776,
                        "src": "11459:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 727,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "11459:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 730,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 776,
                        "src": "11488:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 729,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11488:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 732,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 776,
                        "src": "11510:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 731,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11510:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11449:79:0"
                  },
                  "returnParameters": {
                    "id": 738,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 735,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 776,
                        "src": "11552:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 734,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "11552:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 737,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 776,
                        "src": "11567:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 736,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11567:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11551:32:0"
                  },
                  "scope": 903,
                  "src": "11437:349:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 814,
                    "nodeType": "Block",
                    "src": "11978:140:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 798,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 788,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 779,
                              "src": "11988:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 790,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 552,
                            "src": "11988:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 794,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 781,
                                    "src": "12022:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 795,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "12022:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 796,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12022:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 791,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 779,
                                  "src": "12004:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 792,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 552,
                                "src": "12004:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 793,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 435,
                              "src": "12004:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 797,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12004:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11988:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 799,
                        "nodeType": "ExpressionStatement",
                        "src": "11988:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 810,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 800,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 779,
                              "src": "12048:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 802,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 554,
                            "src": "12048:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 806,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 783,
                                    "src": "12076:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 807,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "12076:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 808,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12076:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 803,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 779,
                                  "src": "12061:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 804,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 554,
                                "src": "12061:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 805,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 435,
                              "src": "12061:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 809,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12061:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12048:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 811,
                        "nodeType": "ExpressionStatement",
                        "src": "12048:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 812,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 779,
                          "src": "12106:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                            "typeString": "struct Rebase memory"
                          }
                        },
                        "functionReturnParameters": 787,
                        "id": 813,
                        "nodeType": "Return",
                        "src": "12099:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 777,
                    "nodeType": "StructuredDocumentation",
                    "src": "11792:48:0",
                    "text": "@notice Add `elastic` and `base` to `total`."
                  },
                  "id": 815,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 784,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 779,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 815,
                        "src": "11867:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 778,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "11867:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 781,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 815,
                        "src": "11896:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 780,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11896:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 783,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 815,
                        "src": "11921:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 782,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11921:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11857:82:0"
                  },
                  "returnParameters": {
                    "id": 787,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 786,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 815,
                        "src": "11963:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 785,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "11963:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11962:15:0"
                  },
                  "scope": 903,
                  "src": "11845:273:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 853,
                    "nodeType": "Block",
                    "src": "12315:140:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 837,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 827,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "12325:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 829,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 552,
                            "src": "12325:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 833,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 820,
                                    "src": "12359:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 834,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "12359:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 835,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12359:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 830,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 818,
                                  "src": "12341:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 831,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 552,
                                "src": "12341:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 832,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 457,
                              "src": "12341:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 836,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12341:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12325:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 838,
                        "nodeType": "ExpressionStatement",
                        "src": "12325:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 849,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 839,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 818,
                              "src": "12385:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 841,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 554,
                            "src": "12385:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 845,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 822,
                                    "src": "12413:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 846,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "12413:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 847,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12413:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 842,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 818,
                                  "src": "12398:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 843,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 554,
                                "src": "12398:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 844,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 457,
                              "src": "12398:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 848,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12398:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12385:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 850,
                        "nodeType": "ExpressionStatement",
                        "src": "12385:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 851,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 818,
                          "src": "12443:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                            "typeString": "struct Rebase memory"
                          }
                        },
                        "functionReturnParameters": 826,
                        "id": 852,
                        "nodeType": "Return",
                        "src": "12436:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 816,
                    "nodeType": "StructuredDocumentation",
                    "src": "12124:53:0",
                    "text": "@notice Subtract `elastic` and `base` to `total`."
                  },
                  "id": 854,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 823,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 818,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 854,
                        "src": "12204:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 817,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "12204:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 820,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 854,
                        "src": "12233:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 819,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12233:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 822,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 854,
                        "src": "12258:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 821,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12258:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12194:82:0"
                  },
                  "returnParameters": {
                    "id": 826,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 825,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 854,
                        "src": "12300:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 824,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "12300:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12299:15:0"
                  },
                  "scope": 903,
                  "src": "12182:273:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 877,
                    "nodeType": "Block",
                    "src": "12673:80:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 875,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 864,
                            "name": "newElastic",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 862,
                            "src": "12683:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 874,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftHandSide": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 865,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 857,
                                "src": "12696:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                                  "typeString": "struct Rebase storage pointer"
                                }
                              },
                              "id": 866,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "memberName": "elastic",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 552,
                              "src": "12696:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "nodeType": "Assignment",
                            "operator": "=",
                            "rightHandSide": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 870,
                                      "name": "elastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 859,
                                      "src": "12730:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 871,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to128",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 359,
                                    "src": "12730:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint128)"
                                    }
                                  },
                                  "id": 872,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "12730:15:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 867,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 857,
                                    "src": "12712:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                                      "typeString": "struct Rebase storage pointer"
                                    }
                                  },
                                  "id": 868,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 552,
                                  "src": "12712:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 869,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "add",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 435,
                                "src": "12712:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                  "typeString": "function (uint128,uint128) pure returns (uint128)"
                                }
                              },
                              "id": 873,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12712:34:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "src": "12696:50:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12683:63:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 876,
                        "nodeType": "ExpressionStatement",
                        "src": "12683:63:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 855,
                    "nodeType": "StructuredDocumentation",
                    "src": "12461:110:0",
                    "text": "@notice Add `elastic` to `total` and update storage.\n @return newElastic Returns updated `elastic`."
                  },
                  "id": 878,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addElastic",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 860,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 857,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 878,
                        "src": "12596:20:0",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 856,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "12596:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 859,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 878,
                        "src": "12618:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 858,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12618:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12595:39:0"
                  },
                  "returnParameters": {
                    "id": 863,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 862,
                        "mutability": "mutable",
                        "name": "newElastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 878,
                        "src": "12653:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 861,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12653:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12652:20:0"
                  },
                  "scope": 903,
                  "src": "12576:177:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 901,
                    "nodeType": "Block",
                    "src": "12978:80:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 899,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 888,
                            "name": "newElastic",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 886,
                            "src": "12988:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 898,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftHandSide": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 889,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 881,
                                "src": "13001:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                                  "typeString": "struct Rebase storage pointer"
                                }
                              },
                              "id": 890,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "memberName": "elastic",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 552,
                              "src": "13001:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "nodeType": "Assignment",
                            "operator": "=",
                            "rightHandSide": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 894,
                                      "name": "elastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 883,
                                      "src": "13035:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 895,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to128",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 359,
                                    "src": "13035:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint128)"
                                    }
                                  },
                                  "id": 896,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "13035:15:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 891,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 881,
                                    "src": "13017:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                                      "typeString": "struct Rebase storage pointer"
                                    }
                                  },
                                  "id": 892,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 552,
                                  "src": "13017:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 893,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 457,
                                "src": "13017:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                  "typeString": "function (uint128,uint128) pure returns (uint128)"
                                }
                              },
                              "id": 897,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13017:34:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "src": "13001:50:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12988:63:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 900,
                        "nodeType": "ExpressionStatement",
                        "src": "12988:63:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 879,
                    "nodeType": "StructuredDocumentation",
                    "src": "12759:117:0",
                    "text": "@notice Subtract `elastic` from `total` and update storage.\n @return newElastic Returns updated `elastic`."
                  },
                  "id": 902,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "subElastic",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 884,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 881,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 902,
                        "src": "12901:20:0",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 880,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 555,
                          "src": "12901:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 883,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 902,
                        "src": "12923:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 882,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12923:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12900:39:0"
                  },
                  "returnParameters": {
                    "id": 887,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 886,
                        "mutability": "mutable",
                        "name": "newElastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 902,
                        "src": "12958:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 885,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12958:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12957:20:0"
                  },
                  "scope": 903,
                  "src": "12881:177:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3107,
              "src": "9649:3411:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 908,
              "linearizedBaseContracts": [
                908
              ],
              "name": "BoringOwnableData",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "8da5cb5b",
                  "id": 905,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 908,
                  "src": "13346:20:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 904,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13346:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "e30c3978",
                  "id": 907,
                  "mutability": "mutable",
                  "name": "pendingOwner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 908,
                  "src": "13372:27:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 906,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13372:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                }
              ],
              "scope": 3107,
              "src": "13313:89:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 909,
                    "name": "BoringOwnableData",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 908,
                    "src": "13430:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringOwnableData_$908",
                      "typeString": "contract BoringOwnableData"
                    }
                  },
                  "id": 910,
                  "nodeType": "InheritanceSpecifier",
                  "src": "13430:17:0"
                }
              ],
              "contractDependencies": [
                908
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1031,
              "linearizedBaseContracts": [
                1031,
                908
              ],
              "name": "BoringOwnable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 916,
                  "name": "OwnershipTransferred",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 915,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 912,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "previousOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 916,
                        "src": "13481:29:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 911,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13481:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 914,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 916,
                        "src": "13512:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 913,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13512:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13480:57:0"
                  },
                  "src": "13454:84:0"
                },
                {
                  "body": {
                    "id": 934,
                    "nodeType": "Block",
                    "src": "13629:94:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 923,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 920,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 905,
                            "src": "13639:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 921,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "13647:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 922,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "13647:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "13639:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 924,
                        "nodeType": "ExpressionStatement",
                        "src": "13639:18:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 928,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13701:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 927,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13693:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 926,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13693:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 929,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13693:10:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 930,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "13705:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 931,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "13705:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 925,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 916,
                            "src": "13672:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 932,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13672:44:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 933,
                        "nodeType": "EmitStatement",
                        "src": "13667:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 917,
                    "nodeType": "StructuredDocumentation",
                    "src": "13544:59:0",
                    "text": "@notice `owner` defaults to msg.sender on construction."
                  },
                  "id": 935,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 918,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13619:2:0"
                  },
                  "returnParameters": {
                    "id": 919,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13629:0:0"
                  },
                  "scope": 1031,
                  "src": "13608:115:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 983,
                    "nodeType": "Block",
                    "src": "14302:369:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 947,
                          "name": "direct",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 940,
                          "src": "14316:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 981,
                          "nodeType": "Block",
                          "src": "14594:71:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 979,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 977,
                                  "name": "pendingOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 907,
                                  "src": "14631:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 978,
                                  "name": "newOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 938,
                                  "src": "14646:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "14631:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 980,
                              "nodeType": "ExpressionStatement",
                              "src": "14631:23:0"
                            }
                          ]
                        },
                        "id": 982,
                        "nodeType": "IfStatement",
                        "src": "14312:353:0",
                        "trueBody": {
                          "id": 976,
                          "nodeType": "Block",
                          "src": "14324:264:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 956,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      "id": 954,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 949,
                                        "name": "newOwner",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 938,
                                        "src": "14368:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "!=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "30",
                                            "id": 952,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "14388:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_0_by_1",
                                              "typeString": "int_const 0"
                                            },
                                            "value": "0"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_rational_0_by_1",
                                              "typeString": "int_const 0"
                                            }
                                          ],
                                          "id": 951,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "14380:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 950,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "14380:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 953,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "14380:10:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      },
                                      "src": "14368:22:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 955,
                                      "name": "renounce",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 942,
                                      "src": "14394:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "14368:34:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4f776e61626c653a207a65726f2061646472657373",
                                    "id": 957,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "14404:23:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_4bea69941b0d0257b3e89326ac37d51764d80d2e6e1a44e2d90b6a6f85f1b830",
                                      "typeString": "literal_string \"Ownable: zero address\""
                                    },
                                    "value": "Ownable: zero address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_4bea69941b0d0257b3e89326ac37d51764d80d2e6e1a44e2d90b6a6f85f1b830",
                                      "typeString": "literal_string \"Ownable: zero address\""
                                    }
                                  ],
                                  "id": 948,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "14360:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 958,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14360:68:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 959,
                              "nodeType": "ExpressionStatement",
                              "src": "14360:68:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 961,
                                    "name": "owner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 905,
                                    "src": "14492:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 962,
                                    "name": "newOwner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 938,
                                    "src": "14499:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 960,
                                  "name": "OwnershipTransferred",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 916,
                                  "src": "14471:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                                    "typeString": "function (address,address)"
                                  }
                                },
                                "id": 963,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14471:37:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 964,
                              "nodeType": "EmitStatement",
                              "src": "14466:42:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 967,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 965,
                                  "name": "owner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 905,
                                  "src": "14522:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 966,
                                  "name": "newOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 938,
                                  "src": "14530:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "14522:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 968,
                              "nodeType": "ExpressionStatement",
                              "src": "14522:16:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 974,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 969,
                                  "name": "pendingOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 907,
                                  "src": "14552:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 972,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "14575:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 971,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "14567:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 970,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "14567:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 973,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "14567:10:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "14552:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 975,
                              "nodeType": "ExpressionStatement",
                              "src": "14552:25:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 936,
                    "nodeType": "StructuredDocumentation",
                    "src": "13729:448:0",
                    "text": "@notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\n Can only be invoked by the current `owner`.\n @param newOwner Address of the new owner.\n @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\n @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                  },
                  "functionSelector": "078dfbe7",
                  "id": 984,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 945,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 944,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1030,
                        "src": "14292:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "14292:9:0"
                    }
                  ],
                  "name": "transferOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 943,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 938,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 984,
                        "src": "14218:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 937,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14218:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 940,
                        "mutability": "mutable",
                        "name": "direct",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 984,
                        "src": "14244:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 939,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14244:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 942,
                        "mutability": "mutable",
                        "name": "renounce",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 984,
                        "src": "14265:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 941,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14265:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14208:76:0"
                  },
                  "returnParameters": {
                    "id": 946,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14302:0:0"
                  },
                  "scope": 1031,
                  "src": "14182:489:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1016,
                    "nodeType": "Block",
                    "src": "14783:297:0",
                    "statements": [
                      {
                        "assignments": [
                          989
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 989,
                            "mutability": "mutable",
                            "name": "_pendingOwner",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1016,
                            "src": "14793:21:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 988,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "14793:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 991,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 990,
                          "name": "pendingOwner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 907,
                          "src": "14817:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "14793:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 996,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 993,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "14866:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 994,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14866:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 995,
                                "name": "_pendingOwner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 989,
                                "src": "14880:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "14866:27:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572",
                              "id": 997,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14895:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_a7ec3208bb4c778bbdbdd3fdfe92b1d315d85dd01a9131ea9f648f906ac7a6b8",
                                "typeString": "literal_string \"Ownable: caller != pending owner\""
                              },
                              "value": "Ownable: caller != pending owner"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_a7ec3208bb4c778bbdbdd3fdfe92b1d315d85dd01a9131ea9f648f906ac7a6b8",
                                "typeString": "literal_string \"Ownable: caller != pending owner\""
                              }
                            ],
                            "id": 992,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14858:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 998,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14858:72:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 999,
                        "nodeType": "ExpressionStatement",
                        "src": "14858:72:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1001,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 905,
                              "src": "14986:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1002,
                              "name": "_pendingOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 989,
                              "src": "14993:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 1000,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 916,
                            "src": "14965:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 1003,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14965:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1004,
                        "nodeType": "EmitStatement",
                        "src": "14960:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1007,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1005,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 905,
                            "src": "15017:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1006,
                            "name": "_pendingOwner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 989,
                            "src": "15025:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "15017:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1008,
                        "nodeType": "ExpressionStatement",
                        "src": "15017:21:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1014,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1009,
                            "name": "pendingOwner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 907,
                            "src": "15048:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1012,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "15071:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 1011,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "15063:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 1010,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "15063:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 1013,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15063:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "15048:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1015,
                        "nodeType": "ExpressionStatement",
                        "src": "15048:25:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 985,
                    "nodeType": "StructuredDocumentation",
                    "src": "14677:68:0",
                    "text": "@notice Needs to be called by `pendingOwner` to claim ownership."
                  },
                  "functionSelector": "4e71e0c8",
                  "id": 1017,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 986,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14773:2:0"
                  },
                  "returnParameters": {
                    "id": 987,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14783:0:0"
                  },
                  "scope": 1031,
                  "src": "14750:330:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1029,
                    "nodeType": "Block",
                    "src": "15172:92:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1024,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1021,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "15190:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 1022,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15190:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1023,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 905,
                                "src": "15204:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "15190:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                              "id": 1025,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "15211:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                                "typeString": "literal_string \"Ownable: caller is not the owner\""
                              },
                              "value": "Ownable: caller is not the owner"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                                "typeString": "literal_string \"Ownable: caller is not the owner\""
                              }
                            ],
                            "id": 1020,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "15182:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1026,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15182:64:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1027,
                        "nodeType": "ExpressionStatement",
                        "src": "15182:64:0"
                      },
                      {
                        "id": 1028,
                        "nodeType": "PlaceholderStatement",
                        "src": "15256:1:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1018,
                    "nodeType": "StructuredDocumentation",
                    "src": "15086:60:0",
                    "text": "@notice Only allows the `owner` to execute the function."
                  },
                  "id": 1030,
                  "name": "onlyOwner",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1019,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15169:2:0"
                  },
                  "src": "15151:113:0",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3107,
              "src": "13404:1862:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1038,
              "linearizedBaseContracts": [
                1038
              ],
              "name": "IMasterContract",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 1032,
                    "nodeType": "StructuredDocumentation",
                    "src": "15414:258:0",
                    "text": "@notice Init function that gets called from `BoringFactory.deploy`.\n Also kown as the constructor for cloned contracts.\n Any ETH send to `BoringFactory.deploy` ends up here.\n @param data Can be abi encoded arguments or anything else."
                  },
                  "functionSelector": "4ddf47d4",
                  "id": 1037,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1035,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1034,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1037,
                        "src": "15691:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1033,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "15691:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15690:21:0"
                  },
                  "returnParameters": {
                    "id": 1036,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15728:0:0"
                  },
                  "scope": 1038,
                  "src": "15677:52:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "15382:349:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1116,
              "linearizedBaseContracts": [
                1116
              ],
              "name": "BoringFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1046,
                  "name": "LogDeploy",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1045,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1040,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1046,
                        "src": "15879:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1039,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15879:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1042,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1046,
                        "src": "15911:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1041,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "15911:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1044,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "cloneAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1046,
                        "src": "15923:28:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1043,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15923:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15878:74:0"
                  },
                  "src": "15863:90:0"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1047,
                    "nodeType": "StructuredDocumentation",
                    "src": "15959:65:0",
                    "text": "@notice Mapping from clone contracts to their masterContract."
                  },
                  "functionSelector": "bafe4f14",
                  "id": 1051,
                  "mutability": "mutable",
                  "name": "masterContractOf",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1116,
                  "src": "16029:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                    "typeString": "mapping(address => address)"
                  },
                  "typeName": {
                    "id": 1050,
                    "keyType": {
                      "id": 1048,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "16037:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "16029:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                      "typeString": "mapping(address => address)"
                    },
                    "valueType": {
                      "id": 1049,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "16048:7:0",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1114,
                    "nodeType": "Block",
                    "src": "16765:1516:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1069,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1064,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1054,
                                "src": "16783:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1067,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "16809:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1066,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "16801:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1065,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "16801:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1068,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "16801:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "16783:28:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374",
                              "id": 1070,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "16813:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ca263bb3a1d34921c755bbb7d563d78653106aed124fb087e2484c54b7a9af02",
                                "typeString": "literal_string \"BoringFactory: No masterContract\""
                              },
                              "value": "BoringFactory: No masterContract"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ca263bb3a1d34921c755bbb7d563d78653106aed124fb087e2484c54b7a9af02",
                                "typeString": "literal_string \"BoringFactory: No masterContract\""
                              }
                            ],
                            "id": 1063,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "16775:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1071,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16775:73:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1072,
                        "nodeType": "ExpressionStatement",
                        "src": "16775:73:0"
                      },
                      {
                        "assignments": [
                          1074
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1074,
                            "mutability": "mutable",
                            "name": "targetBytes",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1114,
                            "src": "16858:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes20",
                              "typeString": "bytes20"
                            },
                            "typeName": {
                              "id": 1073,
                              "name": "bytes20",
                              "nodeType": "ElementaryTypeName",
                              "src": "16858:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes20",
                                "typeString": "bytes20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1079,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1077,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1054,
                              "src": "16888:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 1076,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "16880:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes20_$",
                              "typeString": "type(bytes20)"
                            },
                            "typeName": {
                              "id": 1075,
                              "name": "bytes20",
                              "nodeType": "ElementaryTypeName",
                              "src": "16880:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 1078,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16880:23:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes20",
                            "typeString": "bytes20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "16858:45:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 1080,
                          "name": "useCreate2",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1058,
                          "src": "16978:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 1090,
                          "nodeType": "Block",
                          "src": "17683:405:0",
                          "statements": [
                            {
                              "AST": {
                                "nodeType": "YulBlock",
                                "src": "17706:372:0",
                                "statements": [
                                  {
                                    "nodeType": "YulVariableDeclaration",
                                    "src": "17724:24:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17743:4:0",
                                          "type": "",
                                          "value": "0x40"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mload",
                                        "nodeType": "YulIdentifier",
                                        "src": "17737:5:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17737:11:0"
                                    },
                                    "variables": [
                                      {
                                        "name": "clone",
                                        "nodeType": "YulTypedName",
                                        "src": "17728:5:0",
                                        "type": ""
                                      }
                                    ]
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "17772:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17779:66:0",
                                          "type": "",
                                          "value": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17765:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17765:81:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17765:81:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17874:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17881:4:0",
                                              "type": "",
                                              "value": "0x14"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17870:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17870:16:0"
                                        },
                                        {
                                          "name": "targetBytes",
                                          "nodeType": "YulIdentifier",
                                          "src": "17888:11:0"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17863:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17863:37:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17863:37:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17928:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17935:4:0",
                                              "type": "",
                                              "value": "0x28"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17924:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17924:16:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17942:66:0",
                                          "type": "",
                                          "value": "0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17917:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17917:92:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17917:92:0"
                                  },
                                  {
                                    "nodeType": "YulAssignment",
                                    "src": "18026:38:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "18049:1:0",
                                          "type": "",
                                          "value": "0"
                                        },
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "18052:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "18059:4:0",
                                          "type": "",
                                          "value": "0x37"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "create",
                                        "nodeType": "YulIdentifier",
                                        "src": "18042:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "18042:22:0"
                                    },
                                    "variableNames": [
                                      {
                                        "name": "cloneAddress",
                                        "nodeType": "YulIdentifier",
                                        "src": "18026:12:0"
                                      }
                                    ]
                                  }
                                ]
                              },
                              "evmVersion": "istanbul",
                              "externalReferences": [
                                {
                                  "declaration": 1061,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "18026:12:0",
                                  "valueSize": 1
                                },
                                {
                                  "declaration": 1074,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17888:11:0",
                                  "valueSize": 1
                                }
                              ],
                              "id": 1089,
                              "nodeType": "InlineAssembly",
                              "src": "17697:381:0"
                            }
                          ]
                        },
                        "id": 1091,
                        "nodeType": "IfStatement",
                        "src": "16974:1114:0",
                        "trueBody": {
                          "id": 1088,
                          "nodeType": "Block",
                          "src": "16990:687:0",
                          "statements": [
                            {
                              "assignments": [
                                1082
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1082,
                                  "mutability": "mutable",
                                  "name": "salt",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1088,
                                  "src": "17115:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 1081,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "17115:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1086,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1084,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1056,
                                    "src": "17140:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  ],
                                  "id": 1083,
                                  "name": "keccak256",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -8,
                                  "src": "17130:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                  }
                                },
                                "id": 1085,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "17130:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "17115:30:0"
                            },
                            {
                              "AST": {
                                "nodeType": "YulBlock",
                                "src": "17288:379:0",
                                "statements": [
                                  {
                                    "nodeType": "YulVariableDeclaration",
                                    "src": "17306:24:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17325:4:0",
                                          "type": "",
                                          "value": "0x40"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mload",
                                        "nodeType": "YulIdentifier",
                                        "src": "17319:5:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17319:11:0"
                                    },
                                    "variables": [
                                      {
                                        "name": "clone",
                                        "nodeType": "YulTypedName",
                                        "src": "17310:5:0",
                                        "type": ""
                                      }
                                    ]
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "17354:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17361:66:0",
                                          "type": "",
                                          "value": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17347:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17347:81:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17347:81:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17456:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17463:4:0",
                                              "type": "",
                                              "value": "0x14"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17452:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17452:16:0"
                                        },
                                        {
                                          "name": "targetBytes",
                                          "nodeType": "YulIdentifier",
                                          "src": "17470:11:0"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17445:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17445:37:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17445:37:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17510:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17517:4:0",
                                              "type": "",
                                              "value": "0x28"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17506:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17506:16:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17524:66:0",
                                          "type": "",
                                          "value": "0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17499:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17499:92:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17499:92:0"
                                  },
                                  {
                                    "nodeType": "YulAssignment",
                                    "src": "17608:45:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17632:1:0",
                                          "type": "",
                                          "value": "0"
                                        },
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "17635:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17642:4:0",
                                          "type": "",
                                          "value": "0x37"
                                        },
                                        {
                                          "name": "salt",
                                          "nodeType": "YulIdentifier",
                                          "src": "17648:4:0"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "create2",
                                        "nodeType": "YulIdentifier",
                                        "src": "17624:7:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17624:29:0"
                                    },
                                    "variableNames": [
                                      {
                                        "name": "cloneAddress",
                                        "nodeType": "YulIdentifier",
                                        "src": "17608:12:0"
                                      }
                                    ]
                                  }
                                ]
                              },
                              "evmVersion": "istanbul",
                              "externalReferences": [
                                {
                                  "declaration": 1061,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17608:12:0",
                                  "valueSize": 1
                                },
                                {
                                  "declaration": 1082,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17648:4:0",
                                  "valueSize": 1
                                },
                                {
                                  "declaration": 1074,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17470:11:0",
                                  "valueSize": 1
                                }
                              ],
                              "id": 1087,
                              "nodeType": "InlineAssembly",
                              "src": "17279:388:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1096,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1092,
                              "name": "masterContractOf",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1051,
                              "src": "18097:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 1094,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1093,
                              "name": "cloneAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1061,
                              "src": "18114:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "18097:30:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1095,
                            "name": "masterContract",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1054,
                            "src": "18130:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "18097:47:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1097,
                        "nodeType": "ExpressionStatement",
                        "src": "18097:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1105,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1056,
                              "src": "18208:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                  "typeString": "bytes calldata"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1099,
                                    "name": "cloneAddress",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1061,
                                    "src": "18171:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 1098,
                                  "name": "IMasterContract",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1038,
                                  "src": "18155:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_IMasterContract_$1038_$",
                                    "typeString": "type(contract IMasterContract)"
                                  }
                                },
                                "id": 1100,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "18155:29:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IMasterContract_$1038",
                                  "typeString": "contract IMasterContract"
                                }
                              },
                              "id": 1101,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "init",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1037,
                              "src": "18155:34:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_payable$_t_bytes_memory_ptr_$returns$__$",
                                "typeString": "function (bytes memory) payable external"
                              }
                            },
                            "id": 1104,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1102,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "18197:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 1103,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "value",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18197:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "18155:52:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_payable$_t_bytes_memory_ptr_$returns$__$value",
                              "typeString": "function (bytes memory) payable external"
                            }
                          },
                          "id": 1106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18155:58:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1107,
                        "nodeType": "ExpressionStatement",
                        "src": "18155:58:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1109,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1054,
                              "src": "18239:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1110,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1056,
                              "src": "18255:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1111,
                              "name": "cloneAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1061,
                              "src": "18261:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 1108,
                            "name": "LogDeploy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1046,
                            "src": "18229:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_address_$returns$__$",
                              "typeString": "function (address,bytes memory,address)"
                            }
                          },
                          "id": 1112,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18229:45:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1113,
                        "nodeType": "EmitStatement",
                        "src": "18224:50:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1052,
                    "nodeType": "StructuredDocumentation",
                    "src": "16087:519:0",
                    "text": "@notice Deploys a given master Contract as a clone.\n Any ETH transferred with this call is forwarded to the new clone.\n Emits `LogDeploy`.\n @param masterContract The address of the contract to clone.\n @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\n @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\n @return cloneAddress Address of the created clone contract."
                  },
                  "functionSelector": "1f54245b",
                  "id": 1115,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deploy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1059,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1054,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1115,
                        "src": "16636:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1053,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16636:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1056,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1115,
                        "src": "16668:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1055,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "16668:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1058,
                        "mutability": "mutable",
                        "name": "useCreate2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1115,
                        "src": "16697:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1057,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16697:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16626:92:0"
                  },
                  "returnParameters": {
                    "id": 1062,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1061,
                        "mutability": "mutable",
                        "name": "cloneAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1115,
                        "src": "16743:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1060,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16743:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16742:22:0"
                  },
                  "scope": 1116,
                  "src": "16611:1670:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 3107,
              "src": "15834:2449:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1117,
                    "name": "BoringOwnable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1031,
                    "src": "18398:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringOwnable_$1031",
                      "typeString": "contract BoringOwnable"
                    }
                  },
                  "id": 1118,
                  "nodeType": "InheritanceSpecifier",
                  "src": "18398:13:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1119,
                    "name": "BoringFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1116,
                    "src": "18413:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringFactory_$1116",
                      "typeString": "contract BoringFactory"
                    }
                  },
                  "id": 1120,
                  "nodeType": "InheritanceSpecifier",
                  "src": "18413:13:0"
                }
              ],
              "contractDependencies": [
                908,
                1031,
                1116
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1421,
              "linearizedBaseContracts": [
                1421,
                1116,
                1031,
                908
              ],
              "name": "MasterContractManager",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1126,
                  "name": "LogWhiteListMasterContract",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1125,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1122,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1126,
                        "src": "18466:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1121,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18466:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1124,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1126,
                        "src": "18498:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1123,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18498:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18465:47:0"
                  },
                  "src": "18433:80:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1134,
                  "name": "LogSetMasterContractApproval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1133,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1128,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1134,
                        "src": "18553:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1127,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18553:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1130,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1134,
                        "src": "18585:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1129,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18585:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1132,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1134,
                        "src": "18607:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1131,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18607:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18552:69:0"
                  },
                  "src": "18518:104:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1138,
                  "name": "LogRegisterProtocol",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1137,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1136,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "protocol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1138,
                        "src": "18653:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1135,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18653:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18652:26:0"
                  },
                  "src": "18627:52:0"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1139,
                    "nodeType": "StructuredDocumentation",
                    "src": "18685:52:0",
                    "text": "@notice masterContract to user to approval state"
                  },
                  "functionSelector": "91e0eab5",
                  "id": 1145,
                  "mutability": "mutable",
                  "name": "masterContractApproved",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "18742:74:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                    "typeString": "mapping(address => mapping(address => bool))"
                  },
                  "typeName": {
                    "id": 1144,
                    "keyType": {
                      "id": 1140,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "18750:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "18742:44:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                      "typeString": "mapping(address => mapping(address => bool))"
                    },
                    "valueType": {
                      "id": 1143,
                      "keyType": {
                        "id": 1141,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "18769:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "18761:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      },
                      "valueType": {
                        "id": 1142,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "18780:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1146,
                    "nodeType": "StructuredDocumentation",
                    "src": "18822:83:0",
                    "text": "@notice masterContract to whitelisted state for approval without signed message"
                  },
                  "functionSelector": "12a90c8a",
                  "id": 1150,
                  "mutability": "mutable",
                  "name": "whitelistedMasterContracts",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "18910:58:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                    "typeString": "mapping(address => bool)"
                  },
                  "typeName": {
                    "id": 1149,
                    "keyType": {
                      "id": 1147,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "18918:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "18910:24:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                      "typeString": "mapping(address => bool)"
                    },
                    "valueType": {
                      "id": 1148,
                      "name": "bool",
                      "nodeType": "ElementaryTypeName",
                      "src": "18929:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1151,
                    "nodeType": "StructuredDocumentation",
                    "src": "18974:52:0",
                    "text": "@notice user nonces for masterContract approvals"
                  },
                  "functionSelector": "7ecebe00",
                  "id": 1155,
                  "mutability": "mutable",
                  "name": "nonces",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "19031:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 1154,
                    "keyType": {
                      "id": 1152,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "19039:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "19031:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 1153,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "19050:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "id": 1160,
                  "mutability": "constant",
                  "name": "DOMAIN_SEPARATOR_SIGNATURE_HASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "19079:147:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1156,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19079:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429",
                        "id": 1158,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "19156:69:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866",
                          "typeString": "literal_string \"EIP712Domain(string name,uint256 chainId,address verifyingContract)\""
                        },
                        "value": "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866",
                          "typeString": "literal_string \"EIP712Domain(string name,uint256 chainId,address verifyingContract)\""
                        }
                      ],
                      "id": 1157,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -8,
                      "src": "19146:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 1159,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19146:80:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1163,
                  "mutability": "constant",
                  "name": "EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "19282:77:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 1161,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "19282:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "1901",
                    "id": 1162,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "19349:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                      "typeString": "literal_string \"\u0019\u0001\""
                    },
                    "value": "\u0019\u0001"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1168,
                  "mutability": "constant",
                  "name": "APPROVAL_SIGNATURE_HASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "19365:177:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1164,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19365:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "5365744d6173746572436f6e7472616374417070726f76616c28737472696e67207761726e696e672c6164647265737320757365722c61646472657373206d6173746572436f6e74726163742c626f6f6c20617070726f7665642c75696e74323536206e6f6e636529",
                        "id": 1166,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "19434:107:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2",
                          "typeString": "literal_string \"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\""
                        },
                        "value": "SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2",
                          "typeString": "literal_string \"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\""
                        }
                      ],
                      "id": 1165,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -8,
                      "src": "19424:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 1167,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19424:118:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1170,
                  "mutability": "immutable",
                  "name": "_DOMAIN_SEPARATOR",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "19601:43:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1169,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19601:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1172,
                  "mutability": "immutable",
                  "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1421,
                  "src": "19702:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1171,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19702:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 1187,
                    "nodeType": "Block",
                    "src": "19781:186:0",
                    "statements": [
                      {
                        "assignments": [
                          1176
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1176,
                            "mutability": "mutable",
                            "name": "chainId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1187,
                            "src": "19791:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1175,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "19791:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1177,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "19791:15:0"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "19825:44:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "19839:20:0",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "chainid",
                                  "nodeType": "YulIdentifier",
                                  "src": "19850:7:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "19850:9:0"
                              },
                              "variableNames": [
                                {
                                  "name": "chainId",
                                  "nodeType": "YulIdentifier",
                                  "src": "19839:7:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 1176,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "19839:7:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 1178,
                        "nodeType": "InlineAssembly",
                        "src": "19816:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1185,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1179,
                            "name": "_DOMAIN_SEPARATOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1170,
                            "src": "19878:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1183,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1181,
                                  "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1172,
                                  "src": "19924:25:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 1182,
                                  "name": "chainId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1176,
                                  "src": "19952:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "19924:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1180,
                              "name": "_calculateDomainSeparator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1211,
                              "src": "19898:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bytes32_$",
                                "typeString": "function (uint256) view returns (bytes32)"
                              }
                            },
                            "id": 1184,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "19898:62:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "19878:82:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 1186,
                        "nodeType": "ExpressionStatement",
                        "src": "19878:82:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1188,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1173,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19771:2:0"
                  },
                  "returnParameters": {
                    "id": 1174,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19781:0:0"
                  },
                  "scope": 1421,
                  "src": "19760:207:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1210,
                    "nodeType": "Block",
                    "src": "20056:128:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1198,
                                  "name": "DOMAIN_SEPARATOR_SIGNATURE_HASH",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1160,
                                  "src": "20094:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "42656e746f426f78205631",
                                      "id": 1200,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "string",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "20137:13:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_d7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f",
                                        "typeString": "literal_string \"BentoBox V1\""
                                      },
                                      "value": "BentoBox V1"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_stringliteral_d7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f",
                                        "typeString": "literal_string \"BentoBox V1\""
                                      }
                                    ],
                                    "id": 1199,
                                    "name": "keccak256",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -8,
                                    "src": "20127:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                      "typeString": "function (bytes memory) pure returns (bytes32)"
                                    }
                                  },
                                  "id": 1201,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "20127:24:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1202,
                                  "name": "chainId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1190,
                                  "src": "20153:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1205,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "20170:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_MasterContractManager_$1421",
                                        "typeString": "contract MasterContractManager"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_MasterContractManager_$1421",
                                        "typeString": "contract MasterContractManager"
                                      }
                                    ],
                                    "id": 1204,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "20162:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 1203,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "20162:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 1206,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "20162:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1196,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20083:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1197,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20083:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 1207,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20083:93:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1195,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "20073:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 1208,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20073:104:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 1194,
                        "id": 1209,
                        "nodeType": "Return",
                        "src": "20066:111:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1211,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateDomainSeparator",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1191,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1190,
                        "mutability": "mutable",
                        "name": "chainId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1211,
                        "src": "20008:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1189,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20008:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20007:17:0"
                  },
                  "returnParameters": {
                    "id": 1194,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1193,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1211,
                        "src": "20047:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1192,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "20047:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20046:9:0"
                  },
                  "scope": 1421,
                  "src": "19973:211:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 1229,
                    "nodeType": "Block",
                    "src": "20301:204:0",
                    "statements": [
                      {
                        "assignments": [
                          1217
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1217,
                            "mutability": "mutable",
                            "name": "chainId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1229,
                            "src": "20311:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1216,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "20311:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1218,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "20311:15:0"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "20345:44:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "20359:20:0",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "chainid",
                                  "nodeType": "YulIdentifier",
                                  "src": "20370:7:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "20370:9:0"
                              },
                              "variableNames": [
                                {
                                  "name": "chainId",
                                  "nodeType": "YulIdentifier",
                                  "src": "20359:7:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 1217,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "20359:7:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 1219,
                        "nodeType": "InlineAssembly",
                        "src": "20336:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 1222,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1220,
                              "name": "chainId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1217,
                              "src": "20405:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 1221,
                              "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1172,
                              "src": "20416:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "20405:36:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1225,
                                "name": "chainId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1217,
                                "src": "20490:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1224,
                              "name": "_calculateDomainSeparator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1211,
                              "src": "20464:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bytes32_$",
                                "typeString": "function (uint256) view returns (bytes32)"
                              }
                            },
                            "id": 1226,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "20464:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "id": 1227,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "20405:93:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 1223,
                            "name": "_DOMAIN_SEPARATOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1170,
                            "src": "20444:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 1215,
                        "id": 1228,
                        "nodeType": "Return",
                        "src": "20398:100:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3644e515",
                  "id": 1230,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "DOMAIN_SEPARATOR",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1212,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20268:2:0"
                  },
                  "returnParameters": {
                    "id": 1215,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1214,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1230,
                        "src": "20292:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1213,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "20292:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20291:9:0"
                  },
                  "scope": 1421,
                  "src": "20243:262:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1247,
                    "nodeType": "Block",
                    "src": "20670:104:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1240,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1234,
                              "name": "masterContractOf",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1051,
                              "src": "20680:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 1237,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1235,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "20697:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1236,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "20697:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "20680:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1238,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "20711:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1239,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "20711:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "20680:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1241,
                        "nodeType": "ExpressionStatement",
                        "src": "20680:41:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1243,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "20756:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1244,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "20756:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 1242,
                            "name": "LogRegisterProtocol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1138,
                            "src": "20736:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 1245,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20736:31:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1246,
                        "nodeType": "EmitStatement",
                        "src": "20731:36:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1231,
                    "nodeType": "StructuredDocumentation",
                    "src": "20511:119:0",
                    "text": "@notice Other contracts need to register with this master contract so that users can approve them for the BentoBox."
                  },
                  "functionSelector": "aee4d1b2",
                  "id": 1248,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "registerProtocol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1232,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20660:2:0"
                  },
                  "returnParameters": {
                    "id": 1233,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20670:0:0"
                  },
                  "scope": 1421,
                  "src": "20635:139:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1279,
                    "nodeType": "Block",
                    "src": "20953:254:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1264,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1259,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1251,
                                "src": "20989:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1262,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "21015:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1261,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "21007:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1260,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "21007:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1263,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "21007:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "20989:28:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d6173746572434d67723a2043616e6e6f7420617070726f76652030",
                              "id": 1265,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "21019:30:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_05c987dd69d78c1ee4fa739315e61a9b7045038ace711c67e7c473d70978b7b6",
                                "typeString": "literal_string \"MasterCMgr: Cannot approve 0\""
                              },
                              "value": "MasterCMgr: Cannot approve 0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_05c987dd69d78c1ee4fa739315e61a9b7045038ace711c67e7c473d70978b7b6",
                                "typeString": "literal_string \"MasterCMgr: Cannot approve 0\""
                              }
                            ],
                            "id": 1258,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "20981:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1266,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20981:69:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1267,
                        "nodeType": "ExpressionStatement",
                        "src": "20981:69:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1272,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1268,
                              "name": "whitelistedMasterContracts",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1150,
                              "src": "21080:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 1270,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1269,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1251,
                              "src": "21107:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "21080:42:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1271,
                            "name": "approved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1253,
                            "src": "21125:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "21080:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1273,
                        "nodeType": "ExpressionStatement",
                        "src": "21080:53:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1275,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1251,
                              "src": "21175:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1276,
                              "name": "approved",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1253,
                              "src": "21191:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 1274,
                            "name": "LogWhiteListMasterContract",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1126,
                            "src": "21148:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bool_$returns$__$",
                              "typeString": "function (address,bool)"
                            }
                          },
                          "id": 1277,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21148:52:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1278,
                        "nodeType": "EmitStatement",
                        "src": "21143:57:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1249,
                    "nodeType": "StructuredDocumentation",
                    "src": "20780:79:0",
                    "text": "@notice Enables or disables a contract for approval without signed message."
                  },
                  "functionSelector": "733a9d7c",
                  "id": 1280,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 1256,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 1255,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1030,
                        "src": "20943:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "20943:9:0"
                    }
                  ],
                  "name": "whitelistMasterContract",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1254,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1251,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1280,
                        "src": "20897:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1250,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20897:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1253,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1280,
                        "src": "20921:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1252,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "20921:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20896:39:0"
                  },
                  "returnParameters": {
                    "id": 1257,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20953:0:0"
                  },
                  "scope": 1421,
                  "src": "20864:343:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1419,
                    "nodeType": "Block",
                    "src": "22144:2367:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1302,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1297,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1285,
                                "src": "22180:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1300,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22206:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1299,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "22198:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1298,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "22198:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1301,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22198:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "22180:28:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d6173746572434d67723a206d617374657243206e6f7420736574",
                              "id": 1303,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22210:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d4554bcb32b147c03c1d615ec7e7aaa89c0d578be297eb1b9cec8a89c9a18519",
                                "typeString": "literal_string \"MasterCMgr: masterC not set\""
                              },
                              "value": "MasterCMgr: masterC not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d4554bcb32b147c03c1d615ec7e7aaa89c0d578be297eb1b9cec8a89c9a18519",
                                "typeString": "literal_string \"MasterCMgr: masterC not set\""
                              }
                            ],
                            "id": 1296,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "22172:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1304,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22172:68:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1305,
                        "nodeType": "ExpressionStatement",
                        "src": "22172:68:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 1316,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 1312,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "id": 1308,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1306,
                                "name": "r",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1291,
                                "src": "22346:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1307,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "22351:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "22346:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "id": 1311,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1309,
                                "name": "s",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1293,
                                "src": "22356:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1310,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "22361:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "22356:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "22346:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            },
                            "id": 1315,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1313,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1289,
                              "src": "22366:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 1314,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22371:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "22366:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "22346:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 1403,
                          "nodeType": "Block",
                          "src": "22647:1698:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1351,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1346,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1283,
                                      "src": "22955:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "!=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1349,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "22971:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 1348,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "22963:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 1347,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "22963:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 1350,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "22963:10:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "22955:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a20557365722063616e6e6f742062652030",
                                    "id": 1352,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22975:30:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_e11d9be4a5cd0528cd92f4bcd22421ed87d25e253facc7a8c78e74337e439653",
                                      "typeString": "literal_string \"MasterCMgr: User cannot be 0\""
                                    },
                                    "value": "MasterCMgr: User cannot be 0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_e11d9be4a5cd0528cd92f4bcd22421ed87d25e253facc7a8c78e74337e439653",
                                      "typeString": "literal_string \"MasterCMgr: User cannot be 0\""
                                    }
                                  ],
                                  "id": 1345,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22947:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1353,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22947:59:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1354,
                              "nodeType": "ExpressionStatement",
                              "src": "22947:59:0"
                            },
                            {
                              "assignments": [
                                1356
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1356,
                                  "mutability": "mutable",
                                  "name": "digest",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1403,
                                  "src": "23449:14:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 1355,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "23449:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1386,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1360,
                                        "name": "EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1163,
                                        "src": "23531:40:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "arguments": [],
                                        "expression": {
                                          "argumentTypes": [],
                                          "id": 1361,
                                          "name": "DOMAIN_SEPARATOR",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1230,
                                          "src": "23593:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                                            "typeString": "function () view returns (bytes32)"
                                          }
                                        },
                                        "id": 1362,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "23593:18:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 1366,
                                                "name": "APPROVAL_SIGNATURE_HASH",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1168,
                                                "src": "23708:23:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "condition": {
                                                  "argumentTypes": null,
                                                  "id": 1367,
                                                  "name": "approved",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 1287,
                                                  "src": "23761:8:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                  }
                                                },
                                                "falseExpression": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "hexValue": "5265766f6b652061636365737320746f2042656e746f426f783f",
                                                      "id": 1372,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "kind": "string",
                                                      "lValueRequested": false,
                                                      "nodeType": "Literal",
                                                      "src": "23918:28:0",
                                                      "subdenomination": null,
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_stringliteral_b426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b1",
                                                        "typeString": "literal_string \"Revoke access to BentoBox?\""
                                                      },
                                                      "value": "Revoke access to BentoBox?"
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_stringliteral_b426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b1",
                                                        "typeString": "literal_string \"Revoke access to BentoBox?\""
                                                      }
                                                    ],
                                                    "id": 1371,
                                                    "name": "keccak256",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": -8,
                                                    "src": "23908:9:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                      "typeString": "function (bytes memory) pure returns (bytes32)"
                                                    }
                                                  },
                                                  "id": 1373,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "23908:39:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                  }
                                                },
                                                "id": 1374,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "Conditional",
                                                "src": "23761:186:0",
                                                "trueExpression": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "hexValue": "476976652046554c4c2061636365737320746f2066756e647320696e2028616e6420617070726f76656420746f292042656e746f426f783f",
                                                      "id": 1369,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "kind": "string",
                                                      "lValueRequested": false,
                                                      "nodeType": "Literal",
                                                      "src": "23814:58:0",
                                                      "subdenomination": null,
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_stringliteral_422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b284",
                                                        "typeString": "literal_string \"Give FULL access to funds in (and approved to) BentoBox?\""
                                                      },
                                                      "value": "Give FULL access to funds in (and approved to) BentoBox?"
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_stringliteral_422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b284",
                                                        "typeString": "literal_string \"Give FULL access to funds in (and approved to) BentoBox?\""
                                                      }
                                                    ],
                                                    "id": 1368,
                                                    "name": "keccak256",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": -8,
                                                    "src": "23804:9:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                      "typeString": "function (bytes memory) pure returns (bytes32)"
                                                    }
                                                  },
                                                  "id": 1370,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "23804:69:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                  }
                                                },
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1375,
                                                "name": "user",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1283,
                                                "src": "23977:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1376,
                                                "name": "masterContract",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1285,
                                                "src": "24011:14:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1377,
                                                "name": "approved",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1287,
                                                "src": "24055:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1381,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "UnaryOperation",
                                                "operator": "++",
                                                "prefix": false,
                                                "src": "24093:14:0",
                                                "subExpression": {
                                                  "argumentTypes": null,
                                                  "baseExpression": {
                                                    "argumentTypes": null,
                                                    "id": 1378,
                                                    "name": "nonces",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 1155,
                                                    "src": "24093:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                                      "typeString": "mapping(address => uint256)"
                                                    }
                                                  },
                                                  "id": 1380,
                                                  "indexExpression": {
                                                    "argumentTypes": null,
                                                    "id": 1379,
                                                    "name": "user",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 1283,
                                                    "src": "24100:4:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_address",
                                                      "typeString": "address"
                                                    }
                                                  },
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": true,
                                                  "nodeType": "IndexAccess",
                                                  "src": "24093:12:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                },
                                                {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                },
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                },
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 1364,
                                                "name": "abi",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": -1,
                                                "src": "23668:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_magic_abi",
                                                  "typeString": "abi"
                                                }
                                              },
                                              "id": 1365,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "memberName": "encode",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "23668:10:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                "typeString": "function () pure returns (bytes memory)"
                                              }
                                            },
                                            "id": 1382,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "23668:465:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          ],
                                          "id": 1363,
                                          "name": "keccak256",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -8,
                                          "src": "23633:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                            "typeString": "function (bytes memory) pure returns (bytes32)"
                                          }
                                        },
                                        "id": 1383,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "23633:522:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        },
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1358,
                                        "name": "abi",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -1,
                                        "src": "23493:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_abi",
                                          "typeString": "abi"
                                        }
                                      },
                                      "id": 1359,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "memberName": "encodePacked",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "23493:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                        "typeString": "function () pure returns (bytes memory)"
                                      }
                                    },
                                    "id": 1384,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "23493:680:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  ],
                                  "id": 1357,
                                  "name": "keccak256",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -8,
                                  "src": "23466:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                  }
                                },
                                "id": 1385,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "23466:721:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "23449:738:0"
                            },
                            {
                              "assignments": [
                                1388
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1388,
                                  "mutability": "mutable",
                                  "name": "recoveredAddress",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1403,
                                  "src": "24201:24:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 1387,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "24201:7:0",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1395,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1390,
                                    "name": "digest",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1356,
                                    "src": "24238:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 1391,
                                    "name": "v",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1289,
                                    "src": "24246:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 1392,
                                    "name": "r",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1291,
                                    "src": "24249:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 1393,
                                    "name": "s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1293,
                                    "src": "24252:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "id": 1389,
                                  "name": "ecrecover",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -6,
                                  "src": "24228:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                                    "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                                  }
                                },
                                "id": 1394,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "24228:26:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "24201:53:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1399,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1397,
                                      "name": "recoveredAddress",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1388,
                                      "src": "24276:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 1398,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1283,
                                      "src": "24296:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "src": "24276:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a20496e76616c6964205369676e6174757265",
                                    "id": 1400,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "24302:31:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_bf29b6546a289d23beadf6fcacd96d99c5c43e7a6d531456b5ee498c67360ed0",
                                      "typeString": "literal_string \"MasterCMgr: Invalid Signature\""
                                    },
                                    "value": "MasterCMgr: Invalid Signature"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_bf29b6546a289d23beadf6fcacd96d99c5c43e7a6d531456b5ee498c67360ed0",
                                      "typeString": "literal_string \"MasterCMgr: Invalid Signature\""
                                    }
                                  ],
                                  "id": 1396,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "24268:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1401,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "24268:66:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1402,
                              "nodeType": "ExpressionStatement",
                              "src": "24268:66:0"
                            }
                          ]
                        },
                        "id": 1404,
                        "nodeType": "IfStatement",
                        "src": "22342:2003:0",
                        "trueBody": {
                          "id": 1344,
                          "nodeType": "Block",
                          "src": "22374:267:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1321,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1318,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1283,
                                      "src": "22396:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1319,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "22404:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 1320,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "22404:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "22396:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a2075736572206e6f742073656e646572",
                                    "id": 1322,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22416:29:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_177835414c26a024f7683801887c34467408a8af9c50feec8be133c91db9fc86",
                                      "typeString": "literal_string \"MasterCMgr: user not sender\""
                                    },
                                    "value": "MasterCMgr: user not sender"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_177835414c26a024f7683801887c34467408a8af9c50feec8be133c91db9fc86",
                                      "typeString": "literal_string \"MasterCMgr: user not sender\""
                                    }
                                  ],
                                  "id": 1317,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22388:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1323,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22388:58:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1324,
                              "nodeType": "ExpressionStatement",
                              "src": "22388:58:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1333,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 1326,
                                        "name": "masterContractOf",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1051,
                                        "src": "22468:16:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                          "typeString": "mapping(address => address)"
                                        }
                                      },
                                      "id": 1328,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 1327,
                                        "name": "user",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1283,
                                        "src": "22485:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "22468:22:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1331,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "22502:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 1330,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "22494:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 1329,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "22494:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 1332,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "22494:10:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "22468:36:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a207573657220697320636c6f6e65",
                                    "id": 1334,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22506:27:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_b76e42eaf41acf747fdf8c8aa63b693ddacd062ef356c3e1753f737e4ed2909b",
                                      "typeString": "literal_string \"MasterCMgr: user is clone\""
                                    },
                                    "value": "MasterCMgr: user is clone"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_b76e42eaf41acf747fdf8c8aa63b693ddacd062ef356c3e1753f737e4ed2909b",
                                      "typeString": "literal_string \"MasterCMgr: user is clone\""
                                    }
                                  ],
                                  "id": 1325,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22460:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1335,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22460:74:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1336,
                              "nodeType": "ExpressionStatement",
                              "src": "22460:74:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 1338,
                                      "name": "whitelistedMasterContracts",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1150,
                                      "src": "22556:26:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                        "typeString": "mapping(address => bool)"
                                      }
                                    },
                                    "id": 1340,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 1339,
                                      "name": "masterContract",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1285,
                                      "src": "22583:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "22556:42:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a206e6f742077686974656c6973746564",
                                    "id": 1341,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22600:29:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_ece38d90da69b99e086237a3317fc903e256ad7789d025fcb6c7961c4f89f66b",
                                      "typeString": "literal_string \"MasterCMgr: not whitelisted\""
                                    },
                                    "value": "MasterCMgr: not whitelisted"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_ece38d90da69b99e086237a3317fc903e256ad7789d025fcb6c7961c4f89f66b",
                                      "typeString": "literal_string \"MasterCMgr: not whitelisted\""
                                    }
                                  ],
                                  "id": 1337,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22548:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1342,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22548:82:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1343,
                              "nodeType": "ExpressionStatement",
                              "src": "22548:82:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1411,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1405,
                                "name": "masterContractApproved",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1145,
                                "src": "24374:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                                  "typeString": "mapping(address => mapping(address => bool))"
                                }
                              },
                              "id": 1408,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1406,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1285,
                                "src": "24397:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "24374:38:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 1409,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1407,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1283,
                              "src": "24413:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "24374:44:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1410,
                            "name": "approved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1287,
                            "src": "24421:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "24374:55:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1412,
                        "nodeType": "ExpressionStatement",
                        "src": "24374:55:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1414,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1285,
                              "src": "24473:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1415,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1283,
                              "src": "24489:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1416,
                              "name": "approved",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1287,
                              "src": "24495:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 1413,
                            "name": "LogSetMasterContractApproval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1134,
                            "src": "24444:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bool_$returns$__$",
                              "typeString": "function (address,address,bool)"
                            }
                          },
                          "id": 1417,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24444:60:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1418,
                        "nodeType": "EmitStatement",
                        "src": "24439:65:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1281,
                    "nodeType": "StructuredDocumentation",
                    "src": "21213:456:0",
                    "text": "@notice Approves or revokes a `masterContract` access to `user` funds.\n @param user The address of the user that approves or revokes access.\n @param masterContract The address who gains or loses access.\n @param approved If True approves access. If False revokes access.\n @param v Part of the signature. (See EIP-191)\n @param r Part of the signature. (See EIP-191)\n @param s Part of the signature. (See EIP-191)"
                  },
                  "functionSelector": "c0a47c93",
                  "id": 1420,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setMasterContractApproval",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1294,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1283,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1420,
                        "src": "22008:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1282,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22008:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1285,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1420,
                        "src": "22030:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1284,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22030:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1287,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1420,
                        "src": "22062:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1286,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "22062:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1289,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1420,
                        "src": "22085:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1288,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "22085:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1291,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1420,
                        "src": "22102:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1290,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "22102:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1293,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1420,
                        "src": "22121:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1292,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "22121:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21998:138:0"
                  },
                  "returnParameters": {
                    "id": 1295,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22144:0:0"
                  },
                  "scope": 1421,
                  "src": "21964:2547:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 3107,
              "src": "18364:6149:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1530,
              "linearizedBaseContracts": [
                1530
              ],
              "name": "BaseBoringBatchable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 1445,
                    "nodeType": "Block",
                    "src": "24927:400:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1432,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1429,
                              "name": "_returnData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1424,
                              "src": "25052:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 1430,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "25052:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "3638",
                            "id": 1431,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "25073:2:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_68_by_1",
                              "typeString": "int_const 68"
                            },
                            "value": "68"
                          },
                          "src": "25052:23:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1435,
                        "nodeType": "IfStatement",
                        "src": "25048:67:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "hexValue": "5472616e73616374696f6e2072657665727465642073696c656e746c79",
                            "id": 1433,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "25084:31:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_d0b1e7612ebe87924453e5d4581b9067879655587bae8a2dfee438433699b890",
                              "typeString": "literal_string \"Transaction reverted silently\""
                            },
                            "value": "Transaction reverted silently"
                          },
                          "functionReturnParameters": 1428,
                          "id": 1434,
                          "nodeType": "Return",
                          "src": "25077:38:0"
                        }
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "25135:95:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "25183:37:0",
                              "value": {
                                "arguments": [
                                  {
                                    "name": "_returnData",
                                    "nodeType": "YulIdentifier",
                                    "src": "25202:11:0"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "25215:4:0",
                                    "type": "",
                                    "value": "0x04"
                                  }
                                ],
                                "functionName": {
                                  "name": "add",
                                  "nodeType": "YulIdentifier",
                                  "src": "25198:3:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "25198:22:0"
                              },
                              "variableNames": [
                                {
                                  "name": "_returnData",
                                  "nodeType": "YulIdentifier",
                                  "src": "25183:11:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 1424,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "25183:11:0",
                            "valueSize": 1
                          },
                          {
                            "declaration": 1424,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "25202:11:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 1436,
                        "nodeType": "InlineAssembly",
                        "src": "25126:104:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1439,
                              "name": "_returnData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1424,
                              "src": "25257:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "id": 1441,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "25271:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                    "typeString": "type(string storage pointer)"
                                  },
                                  "typeName": {
                                    "id": 1440,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "25271:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                }
                              ],
                              "id": 1442,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "25270:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                "typeString": "type(string storage pointer)"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                "typeString": "type(string storage pointer)"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1437,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "25246:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 1438,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "decode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "25246:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 1443,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25246:33:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 1428,
                        "id": 1444,
                        "nodeType": "Return",
                        "src": "25239:40:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1422,
                    "nodeType": "StructuredDocumentation",
                    "src": "24653:182:0",
                    "text": "@dev Helper function to extract a useful revert message from a failed call.\n If the returned data is malformed or not correctly abi encoded then this call can fail itself."
                  },
                  "id": 1446,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_getRevertMsg",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1425,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1424,
                        "mutability": "mutable",
                        "name": "_returnData",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1446,
                        "src": "24863:24:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1423,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "24863:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24862:26:0"
                  },
                  "returnParameters": {
                    "id": 1428,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1427,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1446,
                        "src": "24912:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1426,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "24912:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24911:15:0"
                  },
                  "scope": 1530,
                  "src": "24840:487:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1528,
                    "nodeType": "Block",
                    "src": "26289:388:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1468,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1461,
                            "name": "successes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1456,
                            "src": "26299:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                              "typeString": "bool[] memory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1465,
                                  "name": "calls",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1450,
                                  "src": "26322:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                    "typeString": "bytes calldata[] calldata"
                                  }
                                },
                                "id": 1466,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26322:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1464,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "26311:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bool_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (bool[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "id": 1462,
                                  "name": "bool",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "26315:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "id": 1463,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "26315:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                                  "typeString": "bool[]"
                                }
                              }
                            },
                            "id": 1467,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "26311:24:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                              "typeString": "bool[] memory"
                            }
                          },
                          "src": "26299:36:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                            "typeString": "bool[] memory"
                          }
                        },
                        "id": 1469,
                        "nodeType": "ExpressionStatement",
                        "src": "26299:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1477,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1470,
                            "name": "results",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1459,
                            "src": "26345:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                              "typeString": "bytes memory[] memory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1474,
                                  "name": "calls",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1450,
                                  "src": "26367:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                    "typeString": "bytes calldata[] calldata"
                                  }
                                },
                                "id": 1475,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26367:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1473,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "26355:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (bytes memory[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "id": 1471,
                                  "name": "bytes",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "26359:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_storage_ptr",
                                    "typeString": "bytes"
                                  }
                                },
                                "id": 1472,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "26359:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                                  "typeString": "bytes[]"
                                }
                              }
                            },
                            "id": 1476,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "26355:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                              "typeString": "bytes memory[] memory"
                            }
                          },
                          "src": "26345:35:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                            "typeString": "bytes memory[] memory"
                          }
                        },
                        "id": 1478,
                        "nodeType": "ExpressionStatement",
                        "src": "26345:35:0"
                      },
                      {
                        "body": {
                          "id": 1526,
                          "nodeType": "Block",
                          "src": "26433:238:0",
                          "statements": [
                            {
                              "assignments": [
                                1491,
                                1493
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1491,
                                  "mutability": "mutable",
                                  "name": "success",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1526,
                                  "src": "26448:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "typeName": {
                                    "id": 1490,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "26448:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                },
                                {
                                  "constant": false,
                                  "id": 1493,
                                  "mutability": "mutable",
                                  "name": "result",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1526,
                                  "src": "26462:19:0",
                                  "stateVariable": false,
                                  "storageLocation": "memory",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes"
                                  },
                                  "typeName": {
                                    "id": 1492,
                                    "name": "bytes",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "26462:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_storage_ptr",
                                      "typeString": "bytes"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1503,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 1499,
                                      "name": "calls",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1450,
                                      "src": "26512:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                        "typeString": "bytes calldata[] calldata"
                                      }
                                    },
                                    "id": 1501,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 1500,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1480,
                                      "src": "26518:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "26512:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1496,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "26493:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_BaseBoringBatchable_$1530",
                                          "typeString": "contract BaseBoringBatchable"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_BaseBoringBatchable_$1530",
                                          "typeString": "contract BaseBoringBatchable"
                                        }
                                      ],
                                      "id": 1495,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "26485:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 1494,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "26485:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 1497,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "26485:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 1498,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "delegatecall",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "26485:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                    "typeString": "function (bytes memory) returns (bool,bytes memory)"
                                  }
                                },
                                "id": 1502,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "26485:36:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                  "typeString": "tuple(bool,bytes memory)"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "26447:74:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 1508,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1505,
                                      "name": "success",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1491,
                                      "src": "26543:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 1507,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "!",
                                      "prefix": true,
                                      "src": "26554:13:0",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "id": 1506,
                                        "name": "revertOnFail",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1452,
                                        "src": "26555:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "26543:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1510,
                                        "name": "result",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1493,
                                        "src": "26583:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      ],
                                      "id": 1509,
                                      "name": "_getRevertMsg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1446,
                                      "src": "26569:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_string_memory_ptr_$",
                                        "typeString": "function (bytes memory) pure returns (string memory)"
                                      }
                                    },
                                    "id": 1511,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "26569:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_string_memory_ptr",
                                      "typeString": "string memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_string_memory_ptr",
                                      "typeString": "string memory"
                                    }
                                  ],
                                  "id": 1504,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "26535:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1512,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "26535:56:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1513,
                              "nodeType": "ExpressionStatement",
                              "src": "26535:56:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1518,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1514,
                                    "name": "successes",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1456,
                                    "src": "26605:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                                      "typeString": "bool[] memory"
                                    }
                                  },
                                  "id": 1516,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1515,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1480,
                                    "src": "26615:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "26605:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 1517,
                                  "name": "success",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1491,
                                  "src": "26620:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "26605:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 1519,
                              "nodeType": "ExpressionStatement",
                              "src": "26605:22:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1524,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1520,
                                    "name": "results",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1459,
                                    "src": "26641:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                                      "typeString": "bytes memory[] memory"
                                    }
                                  },
                                  "id": 1522,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1521,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1480,
                                    "src": "26649:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "26641:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 1523,
                                  "name": "result",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1493,
                                  "src": "26654:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "src": "26641:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              },
                              "id": 1525,
                              "nodeType": "ExpressionStatement",
                              "src": "26641:19:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1486,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1483,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1480,
                            "src": "26410:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1484,
                              "name": "calls",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1450,
                              "src": "26414:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                "typeString": "bytes calldata[] calldata"
                              }
                            },
                            "id": 1485,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "26414:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "26410:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1527,
                        "initializationExpression": {
                          "assignments": [
                            1480
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 1480,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 1527,
                              "src": "26395:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 1479,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "26395:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 1482,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1481,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "26407:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "26395:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 1488,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "26428:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 1487,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1480,
                              "src": "26428:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 1489,
                          "nodeType": "ExpressionStatement",
                          "src": "26428:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "26390:281:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1447,
                    "nodeType": "StructuredDocumentation",
                    "src": "25333:419:0",
                    "text": "@notice Allows batched call to self (this contract).\n @param calls An array of inputs for each call.\n @param revertOnFail If True then reverts after a failed call and stops doing further calls.\n @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\n @return results An array with the returned data of each function call, mapped one-to-one to `calls`."
                  },
                  "functionSelector": "d2423b51",
                  "id": 1529,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "batch",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1453,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1450,
                        "mutability": "mutable",
                        "name": "calls",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1529,
                        "src": "26171:22:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                          "typeString": "bytes[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1448,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "26171:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_storage_ptr",
                              "typeString": "bytes"
                            }
                          },
                          "id": 1449,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "26171:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                            "typeString": "bytes[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1452,
                        "mutability": "mutable",
                        "name": "revertOnFail",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1529,
                        "src": "26195:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1451,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "26195:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26170:43:0"
                  },
                  "returnParameters": {
                    "id": 1460,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1456,
                        "mutability": "mutable",
                        "name": "successes",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1529,
                        "src": "26240:23:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                          "typeString": "bool[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1454,
                            "name": "bool",
                            "nodeType": "ElementaryTypeName",
                            "src": "26240:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 1455,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "26240:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                            "typeString": "bool[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1459,
                        "mutability": "mutable",
                        "name": "results",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1529,
                        "src": "26265:22:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                          "typeString": "bytes[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1457,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "26265:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_storage_ptr",
                              "typeString": "bytes"
                            }
                          },
                          "id": 1458,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "26265:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                            "typeString": "bytes[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26239:49:0"
                  },
                  "scope": 1530,
                  "src": "26156:521:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "24618:2061:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1531,
                    "name": "BaseBoringBatchable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1530,
                    "src": "26709:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BaseBoringBatchable_$1530",
                      "typeString": "contract BaseBoringBatchable"
                    }
                  },
                  "id": 1532,
                  "nodeType": "InheritanceSpecifier",
                  "src": "26709:19:0"
                }
              ],
              "contractDependencies": [
                1530
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1566,
              "linearizedBaseContracts": [
                1566,
                1530
              ],
              "name": "BoringBatchable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 1564,
                    "nodeType": "Block",
                    "src": "27266:66:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1555,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1537,
                              "src": "27289:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1556,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1539,
                              "src": "27295:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1557,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1541,
                              "src": "27299:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1558,
                              "name": "deadline",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1543,
                              "src": "27307:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1559,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1545,
                              "src": "27317:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1560,
                              "name": "r",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1547,
                              "src": "27320:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1561,
                              "name": "s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1549,
                              "src": "27323:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1552,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1535,
                              "src": "27276:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 1554,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "permit",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 66,
                            "src": "27276:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256,uint8,bytes32,bytes32) external"
                            }
                          },
                          "id": 1562,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27276:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1563,
                        "nodeType": "ExpressionStatement",
                        "src": "27276:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1533,
                    "nodeType": "StructuredDocumentation",
                    "src": "26735:97:0",
                    "text": "@notice Call wrapper that performs `ERC20.permit` on `token`.\n Lookup `IERC20.permit`."
                  },
                  "functionSelector": "7c516e94",
                  "id": 1565,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permitToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1550,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1535,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27093:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1534,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "27093:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1537,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27115:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1536,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27115:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1539,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27137:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1538,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27137:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1541,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27157:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1540,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27157:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1543,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27181:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1542,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27181:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1545,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27207:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1544,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "27207:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1547,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27224:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1546,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "27224:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1549,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1565,
                        "src": "27243:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1548,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "27243:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27083:175:0"
                  },
                  "returnParameters": {
                    "id": 1551,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27266:0:0"
                  },
                  "scope": 1566,
                  "src": "27063:269:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 3107,
              "src": "26681:653:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1568,
                    "name": "MasterContractManager",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1421,
                    "src": "27807:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MasterContractManager_$1421",
                      "typeString": "contract MasterContractManager"
                    }
                  },
                  "id": 1569,
                  "nodeType": "InheritanceSpecifier",
                  "src": "27807:21:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1570,
                    "name": "BoringBatchable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1566,
                    "src": "27830:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringBatchable_$1566",
                      "typeString": "contract BoringBatchable"
                    }
                  },
                  "id": 1571,
                  "nodeType": "InheritanceSpecifier",
                  "src": "27830:15:0"
                }
              ],
              "contractDependencies": [
                908,
                1031,
                1116,
                1421,
                1530,
                1566
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 1567,
                "nodeType": "StructuredDocumentation",
                "src": "27402:382:0",
                "text": "@title BentoBox\n @author BoringCrypto, Keno\n @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\n Yield from this will go to the token depositors.\n Rebasing tokens ARE NOT supported and WILL cause loss of funds.\n Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead."
              },
              "fullyImplemented": true,
              "id": 3106,
              "linearizedBaseContracts": [
                3106,
                1566,
                1530,
                1421,
                1116,
                1031,
                908
              ],
              "name": "BentoBoxV1",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1574,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1572,
                    "name": "BoringMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 412,
                    "src": "27858:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath_$412",
                      "typeString": "library BoringMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27852:29:0",
                  "typeName": {
                    "id": 1573,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "27873:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 1577,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1575,
                    "name": "BoringMath128",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 458,
                    "src": "27892:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath128_$458",
                      "typeString": "library BoringMath128"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27886:32:0",
                  "typeName": {
                    "id": 1576,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "27910:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  }
                },
                {
                  "id": 1580,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1578,
                    "name": "BoringERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 260,
                    "src": "27929:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringERC20_$260",
                      "typeString": "library BoringERC20"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27923:29:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1579,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 72,
                    "src": "27945:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$72",
                      "typeString": "contract IERC20"
                    }
                  }
                },
                {
                  "id": 1583,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1581,
                    "name": "RebaseLibrary",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 903,
                    "src": "27963:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RebaseLibrary_$903",
                      "typeString": "library RebaseLibrary"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27957:31:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1582,
                    "name": "Rebase",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 555,
                    "src": "27981:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                      "typeString": "struct Rebase"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1595,
                  "name": "LogDeposit",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1594,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1585,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1595,
                        "src": "28087:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1584,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28087:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1587,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1595,
                        "src": "28109:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1586,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28109:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1589,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1595,
                        "src": "28131:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1588,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28131:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1591,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1595,
                        "src": "28151:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1590,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28151:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1593,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1595,
                        "src": "28167:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1592,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28167:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28086:95:0"
                  },
                  "src": "28070:112:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1607,
                  "name": "LogWithdraw",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1606,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1597,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1607,
                        "src": "28205:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1596,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28205:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1599,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1607,
                        "src": "28227:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1598,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28227:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1601,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1607,
                        "src": "28249:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1600,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28249:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1603,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1607,
                        "src": "28269:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1602,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28269:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1605,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1607,
                        "src": "28285:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1604,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28285:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28204:95:0"
                  },
                  "src": "28187:113:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1617,
                  "name": "LogTransfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1616,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1609,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1617,
                        "src": "28323:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1608,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28323:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1611,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1617,
                        "src": "28345:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1610,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28345:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1613,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1617,
                        "src": "28367:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1612,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28367:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1615,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1617,
                        "src": "28387:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1614,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28387:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28322:79:0"
                  },
                  "src": "28305:97:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1629,
                  "name": "LogFlashLoan",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1628,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1619,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1629,
                        "src": "28427:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1618,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28427:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1621,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1629,
                        "src": "28453:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1620,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28453:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1623,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1629,
                        "src": "28475:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1622,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28475:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1625,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "feeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1629,
                        "src": "28491:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1624,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28491:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1627,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "receiver",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1629,
                        "src": "28510:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1626,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28510:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28426:109:0"
                  },
                  "src": "28408:128:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1635,
                  "name": "LogStrategyTargetPercentage",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1634,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1631,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1635,
                        "src": "28576:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1630,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28576:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1633,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "targetPercentage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1635,
                        "src": "28598:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1632,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28598:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28575:48:0"
                  },
                  "src": "28542:82:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1641,
                  "name": "LogStrategyQueued",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1640,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1637,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1641,
                        "src": "28653:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1636,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28653:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1639,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "strategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1641,
                        "src": "28675:26:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$147",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1638,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 147,
                          "src": "28675:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$147",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28652:50:0"
                  },
                  "src": "28629:74:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1647,
                  "name": "LogStrategySet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1646,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1643,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1647,
                        "src": "28729:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1642,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28729:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1645,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "strategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1647,
                        "src": "28751:26:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$147",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1644,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 147,
                          "src": "28751:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$147",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28728:50:0"
                  },
                  "src": "28708:71:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1653,
                  "name": "LogStrategyInvest",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1652,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1649,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1653,
                        "src": "28808:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1648,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28808:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1651,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1653,
                        "src": "28830:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1650,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28830:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28807:38:0"
                  },
                  "src": "28784:62:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1659,
                  "name": "LogStrategyDivest",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1658,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1655,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1659,
                        "src": "28875:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1654,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28875:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1657,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1659,
                        "src": "28897:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1656,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28897:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28874:38:0"
                  },
                  "src": "28851:62:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1665,
                  "name": "LogStrategyProfit",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1664,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1661,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1665,
                        "src": "28942:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1660,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "28942:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1663,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1665,
                        "src": "28964:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1662,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28964:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28941:38:0"
                  },
                  "src": "28918:62:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1671,
                  "name": "LogStrategyLoss",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1670,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1667,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1671,
                        "src": "29007:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1666,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "29007:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1669,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1671,
                        "src": "29029:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1668,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29029:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29006:38:0"
                  },
                  "src": "28985:60:0"
                },
                {
                  "canonicalName": "BentoBoxV1.StrategyData",
                  "id": 1678,
                  "members": [
                    {
                      "constant": false,
                      "id": 1673,
                      "mutability": "mutable",
                      "name": "strategyStartDate",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 1678,
                      "src": "29160:24:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      },
                      "typeName": {
                        "id": 1672,
                        "name": "uint64",
                        "nodeType": "ElementaryTypeName",
                        "src": "29160:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 1675,
                      "mutability": "mutable",
                      "name": "targetPercentage",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 1678,
                      "src": "29194:23:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      },
                      "typeName": {
                        "id": 1674,
                        "name": "uint64",
                        "nodeType": "ElementaryTypeName",
                        "src": "29194:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 1677,
                      "mutability": "mutable",
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 1678,
                      "src": "29227:15:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      },
                      "typeName": {
                        "id": 1676,
                        "name": "uint128",
                        "nodeType": "ElementaryTypeName",
                        "src": "29227:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "StrategyData",
                  "nodeType": "StructDefinition",
                  "scope": 3106,
                  "src": "29130:183:0",
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 1680,
                  "mutability": "immutable",
                  "name": "wethToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "29570:34:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$72",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1679,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 72,
                    "src": "29570:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$72",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1685,
                  "mutability": "constant",
                  "name": "USE_ETHEREUM",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "29611:48:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$72",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1681,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 72,
                    "src": "29611:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$72",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 1683,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "29657:1:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        }
                      ],
                      "id": 1682,
                      "name": "IERC20",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 72,
                      "src": "29650:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IERC20_$72_$",
                        "typeString": "type(contract IERC20)"
                      }
                    },
                    "id": 1684,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "29650:9:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$72",
                      "typeString": "contract IERC20"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1688,
                  "mutability": "constant",
                  "name": "FLASH_LOAN_FEE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "29665:44:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1686,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29665:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3530",
                    "id": 1687,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29707:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_50_by_1",
                      "typeString": "int_const 50"
                    },
                    "value": "50"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1691,
                  "mutability": "constant",
                  "name": "FLASH_LOAN_FEE_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "29724:55:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1689,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29724:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "316535",
                    "id": 1690,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29776:3:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_100000_by_1",
                      "typeString": "int_const 100000"
                    },
                    "value": "1e5"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1694,
                  "mutability": "constant",
                  "name": "STRATEGY_DELAY",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "29785:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1692,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29785:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 1693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29827:7:0",
                    "subdenomination": "weeks",
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1697,
                  "mutability": "constant",
                  "name": "MAX_TARGET_PERCENTAGE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "29840:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1695,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29840:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3935",
                    "id": 1696,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29889:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_95_by_1",
                      "typeString": "int_const 95"
                    },
                    "value": "95"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1700,
                  "mutability": "constant",
                  "name": "MINIMUM_SHARE_BALANCE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "29904:53:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1698,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29904:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31303030",
                    "id": 1699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29953:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1000_by_1",
                      "typeString": "int_const 1000"
                    },
                    "value": "1000"
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "functionSelector": "f7888aec",
                  "id": 1706,
                  "mutability": "mutable",
                  "name": "balanceOf",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "30139:63:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                    "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                  },
                  "typeName": {
                    "id": 1705,
                    "keyType": {
                      "contractScope": null,
                      "id": 1701,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 72,
                      "src": "30147:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$72",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30139:46:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                    },
                    "valueType": {
                      "id": 1704,
                      "keyType": {
                        "id": 1702,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "30165:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "30157:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      },
                      "valueType": {
                        "id": 1703,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "30176:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "4ffe34db",
                  "id": 1710,
                  "mutability": "mutable",
                  "name": "totals",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "30244:39:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                    "typeString": "mapping(contract IERC20 => struct Rebase)"
                  },
                  "typeName": {
                    "id": 1709,
                    "keyType": {
                      "contractScope": null,
                      "id": 1707,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 72,
                      "src": "30252:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$72",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30244:25:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                      "typeString": "mapping(contract IERC20 => struct Rebase)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1708,
                      "name": "Rebase",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 555,
                      "src": "30262:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                        "typeString": "struct Rebase"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "228bfd9f",
                  "id": 1714,
                  "mutability": "mutable",
                  "name": "strategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "30290:44:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                    "typeString": "mapping(contract IERC20 => contract IStrategy)"
                  },
                  "typeName": {
                    "id": 1713,
                    "keyType": {
                      "contractScope": null,
                      "id": 1711,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 72,
                      "src": "30298:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$72",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30290:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1712,
                      "name": "IStrategy",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 147,
                      "src": "30308:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IStrategy_$147",
                        "typeString": "contract IStrategy"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "5108a558",
                  "id": 1718,
                  "mutability": "mutable",
                  "name": "pendingStrategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "30340:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                    "typeString": "mapping(contract IERC20 => contract IStrategy)"
                  },
                  "typeName": {
                    "id": 1717,
                    "keyType": {
                      "contractScope": null,
                      "id": 1715,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 72,
                      "src": "30348:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$72",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30340:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1716,
                      "name": "IStrategy",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 147,
                      "src": "30358:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IStrategy_$147",
                        "typeString": "contract IStrategy"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "df23b45b",
                  "id": 1722,
                  "mutability": "mutable",
                  "name": "strategyData",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3106,
                  "src": "30397:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                    "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData)"
                  },
                  "typeName": {
                    "id": 1721,
                    "keyType": {
                      "contractScope": null,
                      "id": 1719,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 72,
                      "src": "30405:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$72",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30397:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                      "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1720,
                      "name": "StrategyData",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 1678,
                      "src": "30415:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_StrategyData_$1678_storage_ptr",
                        "typeString": "struct BentoBoxV1.StrategyData"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1731,
                    "nodeType": "Block",
                    "src": "30584:39:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1729,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1727,
                            "name": "wethToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1680,
                            "src": "30594:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1728,
                            "name": "wethToken_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1724,
                            "src": "30606:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "30594:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 1730,
                        "nodeType": "ExpressionStatement",
                        "src": "30594:22:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1732,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1725,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1724,
                        "mutability": "mutable",
                        "name": "wethToken_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1732,
                        "src": "30558:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1723,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "30558:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30557:19:0"
                  },
                  "returnParameters": {
                    "id": 1726,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30584:0:0"
                  },
                  "scope": 3106,
                  "src": "30546:77:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1777,
                    "nodeType": "Block",
                    "src": "31302:388:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 1747,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 1740,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1737,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1735,
                              "src": "31316:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1738,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "31324:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1739,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "31324:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "31316:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 1746,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1741,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1735,
                              "src": "31338:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1744,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "31354:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                ],
                                "id": 1743,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "31346:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1742,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "31346:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1745,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "31346:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "31338:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "31316:43:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1775,
                        "nodeType": "IfStatement",
                        "src": "31312:361:0",
                        "trueBody": {
                          "id": 1774,
                          "nodeType": "Block",
                          "src": "31361:312:0",
                          "statements": [
                            {
                              "assignments": [
                                1749
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1749,
                                  "mutability": "mutable",
                                  "name": "masterContract",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1774,
                                  "src": "31425:22:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 1748,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "31425:7:0",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1754,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1750,
                                  "name": "masterContractOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1051,
                                  "src": "31450:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                    "typeString": "mapping(address => address)"
                                  }
                                },
                                "id": 1753,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1751,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "31467:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 1752,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "31467:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "31450:28:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "31425:53:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1761,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1756,
                                      "name": "masterContract",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1749,
                                      "src": "31500:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "!=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1759,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "31526:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 1758,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "31518:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 1757,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "31518:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 1760,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "31518:10:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "31500:28:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a206e6f206d6173746572436f6e7472616374",
                                    "id": 1762,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "31530:29:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_d7d14096df5afc631fdc9eae262be0c2759632108b3c050dfdb6c6addefce167",
                                      "typeString": "literal_string \"BentoBox: no masterContract\""
                                    },
                                    "value": "BentoBox: no masterContract"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_d7d14096df5afc631fdc9eae262be0c2759632108b3c050dfdb6c6addefce167",
                                      "typeString": "literal_string \"BentoBox: no masterContract\""
                                    }
                                  ],
                                  "id": 1755,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "31492:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1763,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "31492:68:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1764,
                              "nodeType": "ExpressionStatement",
                              "src": "31492:68:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 1766,
                                        "name": "masterContractApproved",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1145,
                                        "src": "31582:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                                          "typeString": "mapping(address => mapping(address => bool))"
                                        }
                                      },
                                      "id": 1768,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 1767,
                                        "name": "masterContract",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1749,
                                        "src": "31605:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "31582:38:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                        "typeString": "mapping(address => bool)"
                                      }
                                    },
                                    "id": 1770,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 1769,
                                      "name": "from",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1735,
                                      "src": "31621:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "31582:44:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a205472616e73666572206e6f7420617070726f766564",
                                    "id": 1771,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "31628:33:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_a5886c03122dc256fde2b6d013592d60118b2df18772ec3172671a4b2bcdd8ac",
                                      "typeString": "literal_string \"BentoBox: Transfer not approved\""
                                    },
                                    "value": "BentoBox: Transfer not approved"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_a5886c03122dc256fde2b6d013592d60118b2df18772ec3172671a4b2bcdd8ac",
                                      "typeString": "literal_string \"BentoBox: Transfer not approved\""
                                    }
                                  ],
                                  "id": 1765,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "31574:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1772,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "31574:88:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1773,
                              "nodeType": "ExpressionStatement",
                              "src": "31574:88:0"
                            }
                          ]
                        }
                      },
                      {
                        "id": 1776,
                        "nodeType": "PlaceholderStatement",
                        "src": "31682:1:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1733,
                    "nodeType": "StructuredDocumentation",
                    "src": "30714:552:0",
                    "text": "Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\n If 'from' is msg.sender, it's allowed.\n If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\n can be taken by anyone.\n This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\n If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed."
                  },
                  "id": 1778,
                  "name": "allowed",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1736,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1735,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1778,
                        "src": "31288:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1734,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31288:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31287:14:0"
                  },
                  "src": "31271:419:0",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1802,
                    "nodeType": "Block",
                    "src": "32029:89:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1800,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1786,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1784,
                            "src": "32039:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1795,
                                    "name": "strategyData",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1722,
                                    "src": "32083:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                                      "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                                    }
                                  },
                                  "id": 1797,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1796,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1781,
                                    "src": "32096:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "32083:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                                    "typeString": "struct BentoBoxV1.StrategyData storage ref"
                                  }
                                },
                                "id": 1798,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1677,
                                "src": "32083:27:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1791,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "32072:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      ],
                                      "id": 1790,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "32064:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 1789,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "32064:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 1792,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "32064:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1787,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1781,
                                    "src": "32048:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 1788,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 14,
                                  "src": "32048:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 1793,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "32048:30:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1794,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 283,
                              "src": "32048:34:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1799,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "32048:63:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "32039:72:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1801,
                        "nodeType": "ExpressionStatement",
                        "src": "32039:72:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1779,
                    "nodeType": "StructuredDocumentation",
                    "src": "31808:138:0",
                    "text": "@dev Returns the total balance of `token` this contracts holds,\n plus the total amount this contract thinks the strategy holds."
                  },
                  "id": 1803,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_tokenBalanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1782,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1781,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1803,
                        "src": "31976:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1780,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "31976:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31975:14:0"
                  },
                  "returnParameters": {
                    "id": 1785,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1784,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1803,
                        "src": "32013:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1783,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32013:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32012:16:0"
                  },
                  "scope": 3106,
                  "src": "31951:167:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1825,
                    "nodeType": "Block",
                    "src": "32645:62:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1823,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1815,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1813,
                            "src": "32655:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1820,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1808,
                                "src": "32684:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 1821,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1810,
                                "src": "32692:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1816,
                                  "name": "totals",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1710,
                                  "src": "32663:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                    "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                  }
                                },
                                "id": 1818,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1817,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1806,
                                  "src": "32670:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "32663:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              "id": 1819,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toBase",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 618,
                              "src": "32663:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_memory_ptr_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 1822,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "32663:37:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "32655:45:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1824,
                        "nodeType": "ExpressionStatement",
                        "src": "32655:45:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1804,
                    "nodeType": "StructuredDocumentation",
                    "src": "32230:281:0",
                    "text": "@dev Helper function to represent an `amount` of `token` in shares.\n @param token The ERC-20 token.\n @param amount The `token` amount.\n @param roundUp If the result `share` should be rounded up.\n @return share The token amount represented in shares."
                  },
                  "functionSelector": "da5139ca",
                  "id": 1826,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toShare",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1811,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1806,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1826,
                        "src": "32542:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1805,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "32542:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1808,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1826,
                        "src": "32564:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1807,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32564:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1810,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1826,
                        "src": "32588:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1809,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "32588:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32532:74:0"
                  },
                  "returnParameters": {
                    "id": 1814,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1813,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1826,
                        "src": "32630:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1812,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32630:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32629:15:0"
                  },
                  "scope": 3106,
                  "src": "32516:191:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 1848,
                    "nodeType": "Block",
                    "src": "33133:65:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1846,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1838,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1836,
                            "src": "33143:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1843,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1831,
                                "src": "33176:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 1844,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1833,
                                "src": "33183:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1839,
                                  "name": "totals",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1710,
                                  "src": "33152:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                    "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                  }
                                },
                                "id": 1841,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1840,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1829,
                                  "src": "33159:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "33152:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              "id": 1842,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toElastic",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 674,
                              "src": "33152:23:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_memory_ptr_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 1845,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "33152:39:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "33143:48:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1847,
                        "nodeType": "ExpressionStatement",
                        "src": "33143:48:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1827,
                    "nodeType": "StructuredDocumentation",
                    "src": "32713:285:0",
                    "text": "@dev Helper function represent shares back into the `token` amount.\n @param token The ERC-20 token.\n @param share The amount of shares.\n @param roundUp If the result should be rounded up.\n @return amount The share amount back into native representation."
                  },
                  "functionSelector": "56623118",
                  "id": 1849,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1834,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1829,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1849,
                        "src": "33030:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1828,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "33030:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1831,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1849,
                        "src": "33052:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1830,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33052:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1833,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1849,
                        "src": "33075:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1832,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "33075:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33020:73:0"
                  },
                  "returnParameters": {
                    "id": 1837,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1836,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1849,
                        "src": "33117:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1835,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33117:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33116:16:0"
                  },
                  "scope": 3106,
                  "src": "33003:195:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2066,
                    "nodeType": "Block",
                    "src": "33948:2620:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1876,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1871,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1856,
                                "src": "33984:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1874,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "33998:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1873,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "33990:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1872,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "33990:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1875,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "33990:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "33984:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f206e6f7420736574",
                              "id": 1877,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "34002:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              },
                              "value": "BentoBox: to not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              }
                            ],
                            "id": 1870,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "33976:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1878,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33976:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1879,
                        "nodeType": "ExpressionStatement",
                        "src": "33976:49:0"
                      },
                      {
                        "assignments": [
                          1881
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1881,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2066,
                            "src": "34095:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 1880,
                              "name": "IERC20",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 72,
                              "src": "34095:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1888,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            },
                            "id": 1884,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1882,
                              "name": "token_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1852,
                              "src": "34110:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 1883,
                              "name": "USE_ETHEREUM",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1685,
                              "src": "34120:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "src": "34110:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 1886,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1852,
                            "src": "34147:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 1887,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "34110:43:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 1885,
                            "name": "wethToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1680,
                            "src": "34135:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "34095:58:0"
                      },
                      {
                        "assignments": [
                          1890
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1890,
                            "mutability": "mutable",
                            "name": "total",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2066,
                            "src": "34163:19:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 1889,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 555,
                              "src": "34163:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1894,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1891,
                            "name": "totals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1710,
                            "src": "34185:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                              "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                            }
                          },
                          "id": 1893,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1892,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1881,
                            "src": "34192:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "34185:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "34163:35:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 1905,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                "id": 1899,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1896,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1890,
                                    "src": "34338:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 1897,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 552,
                                  "src": "34338:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1898,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34355:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "34338:18:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1904,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1900,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1881,
                                      "src": "34360:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$72",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 1901,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "totalSupply",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 7,
                                    "src": "34360:17:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                                      "typeString": "function () view external returns (uint256)"
                                    }
                                  },
                                  "id": 1902,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34360:19:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1903,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34382:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "34360:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "34338:45:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a204e6f20746f6b656e73",
                              "id": 1906,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "34385:21:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_4e9af363c0eb225433acce27bef4ffc78237802324193bedd0cef86db26aa88a",
                                "typeString": "literal_string \"BentoBox: No tokens\""
                              },
                              "value": "BentoBox: No tokens"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_4e9af363c0eb225433acce27bef4ffc78237802324193bedd0cef86db26aa88a",
                                "typeString": "literal_string \"BentoBox: No tokens\""
                              }
                            ],
                            "id": 1895,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "34330:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1907,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34330:77:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1908,
                        "nodeType": "ExpressionStatement",
                        "src": "34330:77:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1911,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1909,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1860,
                            "src": "34421:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1910,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "34430:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "34421:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 1944,
                          "nodeType": "Block",
                          "src": "34826:186:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1942,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1936,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1858,
                                  "src": "34964:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1939,
                                      "name": "share",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1860,
                                      "src": "34989:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "74727565",
                                      "id": 1940,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "34996:4:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "true"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1937,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1890,
                                      "src": "34973:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 1938,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toElastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 674,
                                    "src": "34973:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 1941,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34973:28:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34964:37:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1943,
                              "nodeType": "ExpressionStatement",
                              "src": "34964:37:0"
                            }
                          ]
                        },
                        "id": 1945,
                        "nodeType": "IfStatement",
                        "src": "34417:595:0",
                        "trueBody": {
                          "id": 1935,
                          "nodeType": "Block",
                          "src": "34433:387:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1918,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1912,
                                  "name": "share",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1860,
                                  "src": "34537:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1915,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1858,
                                      "src": "34558:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "66616c7365",
                                      "id": 1916,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "34566:5:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "false"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1913,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1890,
                                      "src": "34545:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 1914,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toBase",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 618,
                                    "src": "34545:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 1917,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34545:27:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34537:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1919,
                              "nodeType": "ExpressionStatement",
                              "src": "34537:35:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1928,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 1923,
                                          "name": "share",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1860,
                                          "src": "34724:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 1924,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "to128",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 359,
                                        "src": "34724:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256) pure returns (uint128)"
                                        }
                                      },
                                      "id": 1925,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "34724:13:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1920,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1890,
                                        "src": "34709:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 1921,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "base",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 554,
                                      "src": "34709:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "id": 1922,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 435,
                                    "src": "34709:14:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                      "typeString": "function (uint128,uint128) pure returns (uint128)"
                                    }
                                  },
                                  "id": 1926,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34709:29:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 1927,
                                  "name": "MINIMUM_SHARE_BALANCE",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1700,
                                  "src": "34741:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34709:53:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 1934,
                              "nodeType": "IfStatement",
                              "src": "34705:105:0",
                              "trueBody": {
                                "id": 1933,
                                "nodeType": "Block",
                                "src": "34764:46:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "components": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1929,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "34790:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1930,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "34793:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "id": 1931,
                                      "isConstant": false,
                                      "isInlineArray": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "TupleExpression",
                                      "src": "34789:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$_t_rational_0_by_1_$_t_rational_0_by_1_$",
                                        "typeString": "tuple(int_const 0,int_const 0)"
                                      }
                                    },
                                    "functionReturnParameters": 1869,
                                    "id": 1932,
                                    "nodeType": "Return",
                                    "src": "34782:13:0"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 1966,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 1956,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 1952,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 1947,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1854,
                                    "src": "35326:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "!=",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1950,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "35342:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      ],
                                      "id": 1949,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "35334:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 1948,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "35334:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 1951,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "35334:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  "src": "35326:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "||",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  },
                                  "id": 1955,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 1953,
                                    "name": "token_",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1852,
                                    "src": "35351:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "==",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 1954,
                                    "name": "USE_ETHEREUM",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1685,
                                    "src": "35361:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "src": "35351:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "35326:47:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1965,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 1957,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1858,
                                  "src": "35377:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1962,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1890,
                                        "src": "35414:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 1963,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 552,
                                      "src": "35414:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 1959,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1881,
                                          "src": "35403:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        ],
                                        "id": 1958,
                                        "name": "_tokenBalanceOf",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1803,
                                        "src": "35387:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$72_$returns$_t_uint256_$",
                                          "typeString": "function (contract IERC20) view returns (uint256)"
                                        }
                                      },
                                      "id": 1960,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "35387:22:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 1961,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sub",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 305,
                                    "src": "35387:26:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 1964,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "35387:41:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "35377:51:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "35326:102:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20536b696d20746f6f206d756368",
                              "id": 1967,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "35442:25:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_0437eaa0205ada0dd3e2cbc945bdbd0a3aa39c5f7ba00e766d7a75280e66e4de",
                                "typeString": "literal_string \"BentoBox: Skim too much\""
                              },
                              "value": "BentoBox: Skim too much"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_0437eaa0205ada0dd3e2cbc945bdbd0a3aa39c5f7ba00e766d7a75280e66e4de",
                                "typeString": "literal_string \"BentoBox: Skim too much\""
                              }
                            ],
                            "id": 1946,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "35305:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1968,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35305:172:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1969,
                        "nodeType": "ExpressionStatement",
                        "src": "35305:172:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1983,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1970,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1706,
                                "src": "35488:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 1973,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1971,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1881,
                                "src": "35498:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "35488:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1974,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1972,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1856,
                              "src": "35505:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "35488:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1981,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1860,
                                "src": "35536:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1975,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1706,
                                    "src": "35511:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 1977,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1976,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1881,
                                    "src": "35521:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "35511:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 1979,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1978,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1856,
                                  "src": "35528:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "35511:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1980,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 283,
                              "src": "35511:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1982,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35511:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "35488:54:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1984,
                        "nodeType": "ExpressionStatement",
                        "src": "35488:54:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1995,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1985,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1890,
                              "src": "35552:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 1987,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 554,
                            "src": "35552:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1991,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1860,
                                    "src": "35580:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 1992,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "35580:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 1993,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35580:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1988,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1890,
                                  "src": "35565:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 1989,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 554,
                                "src": "35565:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 1990,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 435,
                              "src": "35565:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 1994,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35565:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "35552:42:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 1996,
                        "nodeType": "ExpressionStatement",
                        "src": "35552:42:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2007,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1997,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1890,
                              "src": "35604:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 1999,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 552,
                            "src": "35604:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2003,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1858,
                                    "src": "35638:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2004,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "35638:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2005,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35638:14:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2000,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1890,
                                  "src": "35620:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2001,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 552,
                                "src": "35620:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2002,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 435,
                              "src": "35620:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 2006,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35620:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "35604:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2008,
                        "nodeType": "ExpressionStatement",
                        "src": "35604:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2013,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2009,
                              "name": "totals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1710,
                              "src": "35663:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                              }
                            },
                            "id": 2011,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2010,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1881,
                              "src": "35670:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "35663:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$555_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2012,
                            "name": "total",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1890,
                            "src": "35679:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "35663:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 2014,
                        "nodeType": "ExpressionStatement",
                        "src": "35663:21:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          },
                          "id": 2017,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2015,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1852,
                            "src": "35795:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2016,
                            "name": "USE_ETHEREUM",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1685,
                            "src": "35805:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "35795:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 2035,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2030,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1854,
                              "src": "36142:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2033,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "36158:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                ],
                                "id": 2032,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "36150:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2031,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "36150:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2034,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36150:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "36142:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": null,
                          "id": 2048,
                          "nodeType": "IfStatement",
                          "src": "36138:313:0",
                          "trueBody": {
                            "id": 2047,
                            "nodeType": "Block",
                            "src": "36165:286:0",
                            "statements": [
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2039,
                                      "name": "from",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1854,
                                      "src": "36412:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2042,
                                          "name": "this",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -28,
                                          "src": "36426:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                            "typeString": "contract BentoBoxV1"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_BentoBoxV1_$3106",
                                            "typeString": "contract BentoBoxV1"
                                          }
                                        ],
                                        "id": 2041,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "36418:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 2040,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "36418:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 2043,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "36418:13:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 2044,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1858,
                                      "src": "36433:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2036,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1881,
                                      "src": "36389:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$72",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 2038,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "safeTransferFrom",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 259,
                                    "src": "36389:22:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$72_$",
                                      "typeString": "function (contract IERC20,address,address,uint256)"
                                    }
                                  },
                                  "id": 2045,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "36389:51:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_tuple$__$",
                                    "typeString": "tuple()"
                                  }
                                },
                                "id": 2046,
                                "nodeType": "ExpressionStatement",
                                "src": "36389:51:0"
                              }
                            ]
                          }
                        },
                        "id": 2049,
                        "nodeType": "IfStatement",
                        "src": "35791:660:0",
                        "trueBody": {
                          "id": 2029,
                          "nodeType": "Block",
                          "src": "35819:313:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 2021,
                                              "name": "wethToken",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 1680,
                                              "src": "36085:9:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IERC20_$72",
                                                "typeString": "contract IERC20"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_IERC20_$72",
                                                "typeString": "contract IERC20"
                                              }
                                            ],
                                            "id": 2020,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "36077:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 2019,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "36077:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 2022,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "36077:18:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 2018,
                                        "name": "IWETH",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 114,
                                        "src": "36071:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_contract$_IWETH_$114_$",
                                          "typeString": "type(contract IWETH)"
                                        }
                                      },
                                      "id": 2023,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "36071:25:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IWETH_$114",
                                        "typeString": "contract IWETH"
                                      }
                                    },
                                    "id": 2024,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "deposit",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 108,
                                    "src": "36071:33:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_payable$__$returns$__$",
                                      "typeString": "function () payable external"
                                    }
                                  },
                                  "id": 2026,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "names": [
                                    "value"
                                  ],
                                  "nodeType": "FunctionCallOptions",
                                  "options": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2025,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1858,
                                      "src": "36112:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "src": "36071:48:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_payable$__$returns$__$value",
                                    "typeString": "function () payable external"
                                  }
                                },
                                "id": 2027,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "36071:50:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2028,
                              "nodeType": "ExpressionStatement",
                              "src": "36071:50:0"
                            }
                          ]
                        }
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2051,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1881,
                              "src": "36476:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2052,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1854,
                              "src": "36483:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2053,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1856,
                              "src": "36489:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2054,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1858,
                              "src": "36493:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2055,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1860,
                              "src": "36501:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2050,
                            "name": "LogDeposit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1595,
                            "src": "36465:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256,uint256)"
                            }
                          },
                          "id": 2056,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36465:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2057,
                        "nodeType": "EmitStatement",
                        "src": "36460:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2060,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2058,
                            "name": "amountOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1866,
                            "src": "36517:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2059,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1858,
                            "src": "36529:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36517:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2061,
                        "nodeType": "ExpressionStatement",
                        "src": "36517:18:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2064,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2062,
                            "name": "shareOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1868,
                            "src": "36545:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2063,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1860,
                            "src": "36556:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36545:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2065,
                        "nodeType": "ExpressionStatement",
                        "src": "36545:16:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1850,
                    "nodeType": "StructuredDocumentation",
                    "src": "33204:529:0",
                    "text": "@notice Deposit an amount of `token` represented in either `amount` or `share`.\n @param token_ The ERC-20 token to deposit.\n @param from which account to pull the tokens.\n @param to which account to push the tokens.\n @param amount Token amount in native representation to deposit.\n @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\n @return amountOut The amount deposited.\n @return shareOut The deposited amount represented in shares."
                  },
                  "functionSelector": "02b9446c",
                  "id": 2067,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 1863,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1854,
                          "src": "33896:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 1864,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 1862,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1778,
                        "src": "33888:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "33888:13:0"
                    }
                  ],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1861,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1852,
                        "mutability": "mutable",
                        "name": "token_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2067,
                        "src": "33764:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1851,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "33764:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1854,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2067,
                        "src": "33787:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1853,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33787:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1856,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2067,
                        "src": "33809:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1855,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33809:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1858,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2067,
                        "src": "33829:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1857,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33829:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1860,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2067,
                        "src": "33853:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1859,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33853:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33754:118:0"
                  },
                  "returnParameters": {
                    "id": 1869,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1866,
                        "mutability": "mutable",
                        "name": "amountOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2067,
                        "src": "33911:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1865,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33911:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1868,
                        "mutability": "mutable",
                        "name": "shareOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2067,
                        "src": "33930:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1867,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33930:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33910:37:0"
                  },
                  "scope": 3106,
                  "src": "33738:2830:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2246,
                    "nodeType": "Block",
                    "src": "37163:1911:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2094,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2089,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2074,
                                "src": "37199:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2092,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "37213:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2091,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "37205:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2090,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "37205:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2093,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37205:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "37199:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f206e6f7420736574",
                              "id": 2095,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "37217:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              },
                              "value": "BentoBox: to not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              }
                            ],
                            "id": 2088,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "37191:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2096,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37191:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2097,
                        "nodeType": "ExpressionStatement",
                        "src": "37191:49:0"
                      },
                      {
                        "assignments": [
                          2099
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2099,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2246,
                            "src": "37310:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2098,
                              "name": "IERC20",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 72,
                              "src": "37310:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2106,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            },
                            "id": 2102,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2100,
                              "name": "token_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2070,
                              "src": "37325:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2101,
                              "name": "USE_ETHEREUM",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1685,
                              "src": "37335:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "src": "37325:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 2104,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2070,
                            "src": "37362:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 2105,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "37325:43:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 2103,
                            "name": "wethToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1680,
                            "src": "37350:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "37310:58:0"
                      },
                      {
                        "assignments": [
                          2108
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2108,
                            "mutability": "mutable",
                            "name": "total",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2246,
                            "src": "37378:19:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2107,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 555,
                              "src": "37378:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2112,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2109,
                            "name": "totals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1710,
                            "src": "37400:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                              "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                            }
                          },
                          "id": 2111,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2110,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2099,
                            "src": "37407:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "37400:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "37378:35:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2115,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2113,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2078,
                            "src": "37427:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2114,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "37436:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "37427:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2133,
                          "nodeType": "Block",
                          "src": "37640:149:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2131,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2125,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2076,
                                  "src": "37740:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2128,
                                      "name": "share",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2078,
                                      "src": "37765:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "66616c7365",
                                      "id": 2129,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "37772:5:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "false"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2126,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2108,
                                      "src": "37749:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 2127,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toElastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 674,
                                    "src": "37749:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2130,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "37749:29:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "37740:38:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2132,
                              "nodeType": "ExpressionStatement",
                              "src": "37740:38:0"
                            }
                          ]
                        },
                        "id": 2134,
                        "nodeType": "IfStatement",
                        "src": "37423:366:0",
                        "trueBody": {
                          "id": 2124,
                          "nodeType": "Block",
                          "src": "37439:195:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2122,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2116,
                                  "name": "share",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2078,
                                  "src": "37589:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2119,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2076,
                                      "src": "37610:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "74727565",
                                      "id": 2120,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "37618:4:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "true"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2117,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2108,
                                      "src": "37597:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 2118,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toBase",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 618,
                                    "src": "37597:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$555_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2121,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "37597:26:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "37589:34:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2123,
                              "nodeType": "ExpressionStatement",
                              "src": "37589:34:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2135,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1706,
                                "src": "37799:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2138,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2136,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2099,
                                "src": "37809:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "37799:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2139,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2137,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2072,
                              "src": "37816:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "37799:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2146,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2078,
                                "src": "37851:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2140,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1706,
                                    "src": "37824:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2142,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2141,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2099,
                                    "src": "37834:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "37824:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2144,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2143,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2072,
                                  "src": "37841:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "37824:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2145,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 305,
                              "src": "37824:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2147,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37824:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "37799:58:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2149,
                        "nodeType": "ExpressionStatement",
                        "src": "37799:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2160,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2150,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2108,
                              "src": "37867:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2152,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 552,
                            "src": "37867:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2156,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2076,
                                    "src": "37901:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2157,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "37901:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2158,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37901:14:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2153,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2108,
                                  "src": "37883:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2154,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 552,
                                "src": "37883:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2155,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 457,
                              "src": "37883:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 2159,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37883:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "37867:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2161,
                        "nodeType": "ExpressionStatement",
                        "src": "37867:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2172,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2162,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2108,
                              "src": "37926:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2164,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 554,
                            "src": "37926:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2168,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2078,
                                    "src": "37954:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2169,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 359,
                                  "src": "37954:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2170,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37954:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2165,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2108,
                                  "src": "37939:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2166,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 554,
                                "src": "37939:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2167,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 457,
                              "src": "37939:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 2171,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37939:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "37926:42:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2173,
                        "nodeType": "ExpressionStatement",
                        "src": "37926:42:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 2183,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2178,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2175,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2108,
                                    "src": "38111:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 2176,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "base",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 554,
                                  "src": "38111:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2177,
                                  "name": "MINIMUM_SHARE_BALANCE",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1700,
                                  "src": "38125:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "38111:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                "id": 2182,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2179,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2108,
                                    "src": "38150:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 2180,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "base",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 554,
                                  "src": "38150:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2181,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38164:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "38150:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "38111:54:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a2063616e6e6f7420656d707479",
                              "id": 2184,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "38167:24:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_3a09419fc78523f3366d766a341e48736ccec3b7137bd25440cf4f43d1a0ccc0",
                                "typeString": "literal_string \"BentoBox: cannot empty\""
                              },
                              "value": "BentoBox: cannot empty"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_3a09419fc78523f3366d766a341e48736ccec3b7137bd25440cf4f43d1a0ccc0",
                                "typeString": "literal_string \"BentoBox: cannot empty\""
                              }
                            ],
                            "id": 2174,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "38103:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2185,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38103:89:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2186,
                        "nodeType": "ExpressionStatement",
                        "src": "38103:89:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2191,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2187,
                              "name": "totals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1710,
                              "src": "38202:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                              }
                            },
                            "id": 2189,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2188,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2099,
                              "src": "38209:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "38202:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$555_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2190,
                            "name": "total",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2108,
                            "src": "38218:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$555_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "38202:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$555_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 2192,
                        "nodeType": "ExpressionStatement",
                        "src": "38202:21:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          },
                          "id": 2195,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2193,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2070,
                            "src": "38262:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2194,
                            "name": "USE_ETHEREUM",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1685,
                            "src": "38272:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "38262:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2228,
                          "nodeType": "Block",
                          "src": "38713:243:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2224,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2074,
                                    "src": "38934:2:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2225,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2076,
                                    "src": "38938:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2221,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2099,
                                    "src": "38915:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 2223,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "safeTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 209,
                                  "src": "38915:18:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$72_$",
                                    "typeString": "function (contract IERC20,address,uint256)"
                                  }
                                },
                                "id": 2226,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38915:30:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2227,
                              "nodeType": "ExpressionStatement",
                              "src": "38915:30:0"
                            }
                          ]
                        },
                        "id": 2229,
                        "nodeType": "IfStatement",
                        "src": "38258:698:0",
                        "trueBody": {
                          "id": 2220,
                          "nodeType": "Block",
                          "src": "38286:421:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2203,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2076,
                                    "src": "38449:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 2199,
                                            "name": "wethToken",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1680,
                                            "src": "38428:9:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$72",
                                              "typeString": "contract IERC20"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_IERC20_$72",
                                              "typeString": "contract IERC20"
                                            }
                                          ],
                                          "id": 2198,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "38420:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 2197,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "38420:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 2200,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "38420:18:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 2196,
                                      "name": "IWETH",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 114,
                                      "src": "38414:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IWETH_$114_$",
                                        "typeString": "type(contract IWETH)"
                                      }
                                    },
                                    "id": 2201,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "38414:25:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IWETH_$114",
                                      "typeString": "contract IWETH"
                                    }
                                  },
                                  "id": 2202,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "withdraw",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 113,
                                  "src": "38414:34:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256) external"
                                  }
                                },
                                "id": 2204,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38414:42:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2205,
                              "nodeType": "ExpressionStatement",
                              "src": "38414:42:0"
                            },
                            {
                              "assignments": [
                                2207,
                                null
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2207,
                                  "mutability": "mutable",
                                  "name": "success",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2220,
                                  "src": "38589:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "typeName": {
                                    "id": 2206,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "38589:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                },
                                null
                              ],
                              "id": 2214,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "",
                                    "id": 2212,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "38630:2:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                      "typeString": "literal_string \"\""
                                    },
                                    "value": ""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                      "typeString": "literal_string \"\""
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                        "typeString": "literal_string \"\""
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2208,
                                      "name": "to",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2074,
                                      "src": "38607:2:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "id": 2209,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "call",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "38607:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                      "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                    }
                                  },
                                  "id": 2211,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "names": [
                                    "value"
                                  ],
                                  "nodeType": "FunctionCallOptions",
                                  "options": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2210,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2076,
                                      "src": "38622:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "src": "38607:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                                    "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                  }
                                },
                                "id": 2213,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38607:26:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                  "typeString": "tuple(bool,bytes memory)"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "38588:45:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2216,
                                    "name": "success",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2207,
                                    "src": "38655:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a20455448207472616e73666572206661696c6564",
                                    "id": 2217,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "38664:31:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_ed75230845a0b3ad13f9a81669264ef413cffb7c9fdcdf7ecdf90a793a31b639",
                                      "typeString": "literal_string \"BentoBox: ETH transfer failed\""
                                    },
                                    "value": "BentoBox: ETH transfer failed"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_ed75230845a0b3ad13f9a81669264ef413cffb7c9fdcdf7ecdf90a793a31b639",
                                      "typeString": "literal_string \"BentoBox: ETH transfer failed\""
                                    }
                                  ],
                                  "id": 2215,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "38647:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2218,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38647:49:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2219,
                              "nodeType": "ExpressionStatement",
                              "src": "38647:49:0"
                            }
                          ]
                        }
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2231,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2099,
                              "src": "38982:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2232,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2072,
                              "src": "38989:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2233,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2074,
                              "src": "38995:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2234,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2076,
                              "src": "38999:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2235,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2078,
                              "src": "39007:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2230,
                            "name": "LogWithdraw",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1607,
                            "src": "38970:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256,uint256)"
                            }
                          },
                          "id": 2236,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38970:43:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2237,
                        "nodeType": "EmitStatement",
                        "src": "38965:48:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2240,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2238,
                            "name": "amountOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2084,
                            "src": "39023:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2239,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2076,
                            "src": "39035:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39023:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2241,
                        "nodeType": "ExpressionStatement",
                        "src": "39023:18:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2244,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2242,
                            "name": "shareOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2086,
                            "src": "39051:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2243,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2078,
                            "src": "39062:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39051:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2245,
                        "nodeType": "ExpressionStatement",
                        "src": "39051:16:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2068,
                    "nodeType": "StructuredDocumentation",
                    "src": "36574:381:0",
                    "text": "@notice Withdraws an amount of `token` from a user account.\n @param token_ The ERC-20 token to withdraw.\n @param from which user to pull the tokens.\n @param to which user to push the tokens.\n @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\n @param share Like above, but `share` takes precedence over `amount`."
                  },
                  "functionSelector": "97da6d30",
                  "id": 2247,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2081,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2072,
                          "src": "37111:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2082,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2080,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1778,
                        "src": "37103:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "37103:13:0"
                    }
                  ],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2079,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2070,
                        "mutability": "mutable",
                        "name": "token_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2247,
                        "src": "36987:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2069,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "36987:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2072,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2247,
                        "src": "37010:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2071,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37010:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2074,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2247,
                        "src": "37032:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2073,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37032:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2076,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2247,
                        "src": "37052:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2075,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37052:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2078,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2247,
                        "src": "37076:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2077,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37076:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36977:118:0"
                  },
                  "returnParameters": {
                    "id": 2087,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2084,
                        "mutability": "mutable",
                        "name": "amountOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2247,
                        "src": "37126:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2083,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37126:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2086,
                        "mutability": "mutable",
                        "name": "shareOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2247,
                        "src": "37145:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2085,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37145:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37125:37:0"
                  },
                  "scope": 3106,
                  "src": "36960:2114:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2309,
                    "nodeType": "Block",
                    "src": "39708:327:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2268,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2263,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2254,
                                "src": "39744:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2266,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "39758:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2265,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "39750:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2264,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "39750:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2267,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "39750:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "39744:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f206e6f7420736574",
                              "id": 2269,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "39762:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              },
                              "value": "BentoBox: to not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              }
                            ],
                            "id": 2262,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "39736:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2270,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39736:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2271,
                        "nodeType": "ExpressionStatement",
                        "src": "39736:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2285,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2272,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1706,
                                "src": "39855:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2275,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2273,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2250,
                                "src": "39865:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "39855:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2276,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2274,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2252,
                              "src": "39872:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "39855:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2283,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2256,
                                "src": "39907:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2277,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1706,
                                    "src": "39880:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2279,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2278,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2250,
                                    "src": "39890:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "39880:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2281,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2280,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2252,
                                  "src": "39897:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "39880:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2282,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 305,
                              "src": "39880:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2284,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "39880:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39855:58:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2286,
                        "nodeType": "ExpressionStatement",
                        "src": "39855:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2300,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2287,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1706,
                                "src": "39923:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2290,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2288,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2250,
                                "src": "39933:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "39923:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2291,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2289,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2254,
                              "src": "39940:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "39923:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2298,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2256,
                                "src": "39971:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2292,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1706,
                                    "src": "39946:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2294,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2293,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2250,
                                    "src": "39956:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "39946:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2296,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2295,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2254,
                                  "src": "39963:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "39946:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2297,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 283,
                              "src": "39946:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2299,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "39946:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39923:54:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2301,
                        "nodeType": "ExpressionStatement",
                        "src": "39923:54:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2303,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2250,
                              "src": "40005:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2304,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2252,
                              "src": "40012:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2305,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2254,
                              "src": "40018:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2306,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2256,
                              "src": "40022:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2302,
                            "name": "LogTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1617,
                            "src": "39993:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256)"
                            }
                          },
                          "id": 2307,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39993:35:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2308,
                        "nodeType": "EmitStatement",
                        "src": "39988:40:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2248,
                    "nodeType": "StructuredDocumentation",
                    "src": "39080:268:0",
                    "text": "@notice Transfer shares from a user account to another one.\n @param token The ERC-20 token to transfer.\n @param from which user to pull the tokens.\n @param to which user to push the tokens.\n @param share The amount of `token` in shares."
                  },
                  "functionSelector": "f18d03cc",
                  "id": 2310,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2259,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2252,
                          "src": "39702:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2260,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2258,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1778,
                        "src": "39694:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "39694:13:0"
                    }
                  ],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2257,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2250,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2310,
                        "src": "39603:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2249,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "39603:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2252,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2310,
                        "src": "39625:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2251,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39625:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2254,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2310,
                        "src": "39647:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2253,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39647:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2256,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2310,
                        "src": "39667:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2255,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "39667:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39593:93:0"
                  },
                  "returnParameters": {
                    "id": 2261,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39708:0:0"
                  },
                  "scope": 3106,
                  "src": "39576:459:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2415,
                    "nodeType": "Block",
                    "src": "40641:559:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2335,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2328,
                                  "name": "tos",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2318,
                                  "src": "40677:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                    "typeString": "address[] calldata"
                                  }
                                },
                                "id": 2330,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2329,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40681:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "40677:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2333,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "40695:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2332,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "40687:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2331,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "40687:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2334,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "40687:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "40677:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f5b305d206e6f7420736574",
                              "id": 2336,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "40699:25:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_86e38d8947702dc88c8a2cb40de95cb4c5aa30b612f692f9ec7fe577d43db136",
                                "typeString": "literal_string \"BentoBox: to[0] not set\""
                              },
                              "value": "BentoBox: to[0] not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_86e38d8947702dc88c8a2cb40de95cb4c5aa30b612f692f9ec7fe577d43db136",
                                "typeString": "literal_string \"BentoBox: to[0] not set\""
                              }
                            ],
                            "id": 2327,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "40669:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2337,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40669:56:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2338,
                        "nodeType": "ExpressionStatement",
                        "src": "40669:56:0"
                      },
                      {
                        "assignments": [
                          2340
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2340,
                            "mutability": "mutable",
                            "name": "totalAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2415,
                            "src": "40795:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2339,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "40795:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2341,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "40795:19:0"
                      },
                      {
                        "assignments": [
                          2343
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2343,
                            "mutability": "mutable",
                            "name": "len",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2415,
                            "src": "40824:11:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2342,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "40824:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2346,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2344,
                            "name": "tos",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2318,
                            "src": "40838:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                              "typeString": "address[] calldata"
                            }
                          },
                          "id": 2345,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "40838:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "40824:24:0"
                      },
                      {
                        "body": {
                          "id": 2398,
                          "nodeType": "Block",
                          "src": "40892:228:0",
                          "statements": [
                            {
                              "assignments": [
                                2358
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2358,
                                  "mutability": "mutable",
                                  "name": "to",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2398,
                                  "src": "40906:10:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 2357,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "40906:7:0",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2362,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2359,
                                  "name": "tos",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2318,
                                  "src": "40919:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                    "typeString": "address[] calldata"
                                  }
                                },
                                "id": 2361,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2360,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2348,
                                  "src": "40923:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "40919:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "40906:19:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2378,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2363,
                                      "name": "balanceOf",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1706,
                                      "src": "40939:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2366,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2364,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2313,
                                      "src": "40949:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$72",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "40939:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2367,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2365,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2358,
                                    "src": "40956:2:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "40939:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2374,
                                        "name": "shares",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2321,
                                        "src": "40987:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                          "typeString": "uint256[] calldata"
                                        }
                                      },
                                      "id": 2376,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2375,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2348,
                                        "src": "40994:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "40987:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 2368,
                                          "name": "balanceOf",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1706,
                                          "src": "40962:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                            "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                          }
                                        },
                                        "id": 2370,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 2369,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2313,
                                          "src": "40972:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "40962:16:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                          "typeString": "mapping(address => uint256)"
                                        }
                                      },
                                      "id": 2372,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2371,
                                        "name": "to",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2358,
                                        "src": "40979:2:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "40962:20:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2373,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 283,
                                    "src": "40962:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2377,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "40962:35:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "40939:58:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2379,
                              "nodeType": "ExpressionStatement",
                              "src": "40939:58:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2387,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2380,
                                  "name": "totalAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2340,
                                  "src": "41011:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2383,
                                        "name": "shares",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2321,
                                        "src": "41041:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                          "typeString": "uint256[] calldata"
                                        }
                                      },
                                      "id": 2385,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2384,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2348,
                                        "src": "41048:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "41041:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2381,
                                      "name": "totalAmount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2340,
                                      "src": "41025:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2382,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 283,
                                    "src": "41025:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2386,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "41025:26:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "41011:40:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2388,
                              "nodeType": "ExpressionStatement",
                              "src": "41011:40:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2390,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2313,
                                    "src": "41082:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2391,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2315,
                                    "src": "41089:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2392,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2358,
                                    "src": "41095:2:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2393,
                                      "name": "shares",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2321,
                                      "src": "41099:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 2395,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2394,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2348,
                                      "src": "41106:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "41099:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2389,
                                  "name": "LogTransfer",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1617,
                                  "src": "41070:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,address,address,uint256)"
                                  }
                                },
                                "id": 2396,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "41070:39:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2397,
                              "nodeType": "EmitStatement",
                              "src": "41065:44:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2353,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2351,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2348,
                            "src": "40878:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2352,
                            "name": "len",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2343,
                            "src": "40882:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "40878:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2399,
                        "initializationExpression": {
                          "assignments": [
                            2348
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2348,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2399,
                              "src": "40863:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2347,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "40863:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2350,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2349,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "40875:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "40863:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2355,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "40887:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2354,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2348,
                              "src": "40887:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2356,
                          "nodeType": "ExpressionStatement",
                          "src": "40887:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "40858:262:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2413,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2400,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1706,
                                "src": "41129:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2403,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2401,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2313,
                                "src": "41139:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "41129:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2404,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2402,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2315,
                              "src": "41146:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "41129:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2411,
                                "name": "totalAmount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2340,
                                "src": "41181:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2405,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1706,
                                    "src": "41154:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2407,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2406,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2313,
                                    "src": "41164:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "41154:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2409,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2408,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2315,
                                  "src": "41171:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "41154:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2410,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 305,
                              "src": "41154:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2412,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "41154:39:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "41129:64:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2414,
                        "nodeType": "ExpressionStatement",
                        "src": "41129:64:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2311,
                    "nodeType": "StructuredDocumentation",
                    "src": "40041:303:0",
                    "text": "@notice Transfer shares from a user account to multiple other ones.\n @param token The ERC-20 token to transfer.\n @param from which user to pull the tokens.\n @param tos The receivers of the tokens.\n @param shares The amount of `token` in shares for each receiver in `tos`."
                  },
                  "functionSelector": "0fca8843",
                  "id": 2416,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2324,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2315,
                          "src": "40635:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2325,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2323,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1778,
                        "src": "40627:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "40627:13:0"
                    }
                  ],
                  "name": "transferMultiple",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2322,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2313,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2416,
                        "src": "40512:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2312,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "40512:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2315,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2416,
                        "src": "40534:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2314,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "40534:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2318,
                        "mutability": "mutable",
                        "name": "tos",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2416,
                        "src": "40556:22:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2316,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "40556:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 2317,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "40556:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2321,
                        "mutability": "mutable",
                        "name": "shares",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2416,
                        "src": "40588:25:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2319,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "40588:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2320,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "40588:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40502:117:0"
                  },
                  "returnParameters": {
                    "id": 2326,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40641:0:0"
                  },
                  "scope": 3106,
                  "src": "40477:723:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2484,
                    "nodeType": "Block",
                    "src": "42118:384:0",
                    "statements": [
                      {
                        "assignments": [
                          2431
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2431,
                            "mutability": "mutable",
                            "name": "fee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2484,
                            "src": "42128:11:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2430,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "42128:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2438,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2437,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2434,
                                "name": "FLASH_LOAN_FEE",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1688,
                                "src": "42153:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2432,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2425,
                                "src": "42142:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2433,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "mul",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 333,
                              "src": "42142:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2435,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "42142:26:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2436,
                            "name": "FLASH_LOAN_FEE_PRECISION",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1691,
                            "src": "42171:24:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42142:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "42128:67:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2442,
                              "name": "receiver",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2421,
                              "src": "42224:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2443,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2425,
                              "src": "42234:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2439,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2423,
                              "src": "42205:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2441,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 209,
                            "src": "42205:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$72_$",
                              "typeString": "function (contract IERC20,address,uint256)"
                            }
                          },
                          "id": 2444,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42205:36:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2445,
                        "nodeType": "ExpressionStatement",
                        "src": "42205:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2449,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "42273:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2450,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "42273:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2451,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2423,
                              "src": "42285:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2452,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2425,
                              "src": "42292:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2453,
                              "name": "fee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2431,
                              "src": "42300:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2454,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2427,
                              "src": "42305:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2446,
                              "name": "borrower",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2419,
                              "src": "42252:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IFlashBorrower_$87",
                                "typeString": "contract IFlashBorrower"
                              }
                            },
                            "id": 2448,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "onFlashLoan",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 86,
                            "src": "42252:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_contract$_IERC20_$72_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,contract IERC20,uint256,uint256,bytes memory) external"
                            }
                          },
                          "id": 2455,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42252:58:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2456,
                        "nodeType": "ExpressionStatement",
                        "src": "42252:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2469,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2459,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2423,
                                    "src": "42345:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  ],
                                  "id": 2458,
                                  "name": "_tokenBalanceOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1803,
                                  "src": "42329:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$72_$returns$_t_uint256_$",
                                    "typeString": "function (contract IERC20) view returns (uint256)"
                                  }
                                },
                                "id": 2460,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "42329:22:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2465,
                                        "name": "fee",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2431,
                                        "src": "42380:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2466,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "to128",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 359,
                                      "src": "42380:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256) pure returns (uint128)"
                                      }
                                    },
                                    "id": 2467,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "42380:11:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2461,
                                      "name": "totals",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1710,
                                      "src": "42355:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                        "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                      }
                                    },
                                    "id": 2463,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2462,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2423,
                                      "src": "42362:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$72",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "42355:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                      "typeString": "struct Rebase storage ref"
                                    }
                                  },
                                  "id": 2464,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "addElastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 878,
                                  "src": "42355:24:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$555_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_storage_ptr_$",
                                    "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                  }
                                },
                                "id": 2468,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "42355:37:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "42329:63:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a2057726f6e6720616d6f756e74",
                              "id": 2470,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "42394:24:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                "typeString": "literal_string \"BentoBox: Wrong amount\""
                              },
                              "value": "BentoBox: Wrong amount"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                "typeString": "literal_string \"BentoBox: Wrong amount\""
                              }
                            ],
                            "id": 2457,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "42321:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2471,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42321:98:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2472,
                        "nodeType": "ExpressionStatement",
                        "src": "42321:98:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2476,
                                  "name": "borrower",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2419,
                                  "src": "42455:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IFlashBorrower_$87",
                                    "typeString": "contract IFlashBorrower"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IFlashBorrower_$87",
                                    "typeString": "contract IFlashBorrower"
                                  }
                                ],
                                "id": 2475,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "42447:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2474,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "42447:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2477,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42447:17:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2478,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2423,
                              "src": "42466:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2479,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2425,
                              "src": "42473:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2480,
                              "name": "fee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2431,
                              "src": "42481:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2481,
                              "name": "receiver",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2421,
                              "src": "42486:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 2473,
                            "name": "LogFlashLoan",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1629,
                            "src": "42434:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_contract$_IERC20_$72_$_t_uint256_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,contract IERC20,uint256,uint256,address)"
                            }
                          },
                          "id": 2482,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42434:61:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2483,
                        "nodeType": "EmitStatement",
                        "src": "42429:66:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2417,
                    "nodeType": "StructuredDocumentation",
                    "src": "41206:388:0",
                    "text": "@notice Flashloan ability.\n @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\n @param receiver Address of the token receiver.\n @param token The address of the token to receive.\n @param amount of the tokens to receive.\n @param data The calldata to pass to the `borrower` contract."
                  },
                  "functionSelector": "f1676d37",
                  "id": 2485,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "flashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2428,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2419,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2485,
                        "src": "41980:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFlashBorrower_$87",
                          "typeString": "contract IFlashBorrower"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2418,
                          "name": "IFlashBorrower",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 87,
                          "src": "41980:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IFlashBorrower_$87",
                            "typeString": "contract IFlashBorrower"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2421,
                        "mutability": "mutable",
                        "name": "receiver",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2485,
                        "src": "42013:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2420,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "42013:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2423,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2485,
                        "src": "42039:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2422,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "42039:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2425,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2485,
                        "src": "42061:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2424,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "42061:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2427,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2485,
                        "src": "42085:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2426,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "42085:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41970:140:0"
                  },
                  "returnParameters": {
                    "id": 2429,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42118:0:0"
                  },
                  "scope": 3106,
                  "src": "41952:550:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2624,
                    "nodeType": "Block",
                    "src": "43609:720:0",
                    "statements": [
                      {
                        "assignments": [
                          2506
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2506,
                            "mutability": "mutable",
                            "name": "fees",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2624,
                            "src": "43619:21:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                              "typeString": "uint256[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 2504,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43619:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2505,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43619:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                "typeString": "uint256[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2513,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2510,
                                "name": "tokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2494,
                                "src": "43657:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                                  "typeString": "contract IERC20[] calldata"
                                }
                              },
                              "id": 2511,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "43657:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2509,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "43643:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (uint256[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 2507,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43647:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2508,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43647:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                "typeString": "uint256[]"
                              }
                            }
                          },
                          "id": 2512,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43643:28:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                            "typeString": "uint256[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43619:52:0"
                      },
                      {
                        "assignments": [
                          2515
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2515,
                            "mutability": "mutable",
                            "name": "len",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2624,
                            "src": "43682:11:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2514,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "43682:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2518,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2516,
                            "name": "tokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2494,
                            "src": "43696:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                              "typeString": "contract IERC20[] calldata"
                            }
                          },
                          "id": 2517,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "43696:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43682:27:0"
                      },
                      {
                        "body": {
                          "id": 2558,
                          "nodeType": "Block",
                          "src": "43753:192:0",
                          "statements": [
                            {
                              "assignments": [
                                2530
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2530,
                                  "mutability": "mutable",
                                  "name": "amount",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2558,
                                  "src": "43767:14:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2529,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "43767:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2534,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2531,
                                  "name": "amounts",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2497,
                                  "src": "43784:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                    "typeString": "uint256[] calldata"
                                  }
                                },
                                "id": 2533,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2532,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2520,
                                  "src": "43792:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "43784:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "43767:27:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2544,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2535,
                                    "name": "fees",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2506,
                                    "src": "43808:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                      "typeString": "uint256[] memory"
                                    }
                                  },
                                  "id": 2537,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2536,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2520,
                                    "src": "43813:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "43808:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2543,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2540,
                                        "name": "FLASH_LOAN_FEE",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1688,
                                        "src": "43829:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2538,
                                        "name": "amount",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2530,
                                        "src": "43818:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2539,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 333,
                                      "src": "43818:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 2541,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "43818:26:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2542,
                                    "name": "FLASH_LOAN_FEE_PRECISION",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1691,
                                    "src": "43847:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "43818:53:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "43808:63:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2545,
                              "nodeType": "ExpressionStatement",
                              "src": "43808:63:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2550,
                                      "name": "receivers",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2491,
                                      "src": "43909:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                        "typeString": "address[] calldata"
                                      }
                                    },
                                    "id": 2552,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2551,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2520,
                                      "src": "43919:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "43909:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2553,
                                      "name": "amounts",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2497,
                                      "src": "43923:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 2555,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2554,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2520,
                                      "src": "43931:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "43923:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2546,
                                      "name": "tokens",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2494,
                                      "src": "43886:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                                        "typeString": "contract IERC20[] calldata"
                                      }
                                    },
                                    "id": 2548,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2547,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2520,
                                      "src": "43893:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "43886:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 2549,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "safeTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 209,
                                  "src": "43886:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$72_$",
                                    "typeString": "function (contract IERC20,address,uint256)"
                                  }
                                },
                                "id": 2556,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "43886:48:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2557,
                              "nodeType": "ExpressionStatement",
                              "src": "43886:48:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2525,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2523,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2520,
                            "src": "43739:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2524,
                            "name": "len",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2515,
                            "src": "43743:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43739:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2559,
                        "initializationExpression": {
                          "assignments": [
                            2520
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2520,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2559,
                              "src": "43724:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2519,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43724:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2522,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2521,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "43736:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "43724:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2527,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "43748:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2526,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2520,
                              "src": "43748:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2528,
                          "nodeType": "ExpressionStatement",
                          "src": "43748:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "43719:226:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2563,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "43981:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2564,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "43981:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2565,
                              "name": "tokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2494,
                              "src": "43993:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                                "typeString": "contract IERC20[] calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2566,
                              "name": "amounts",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2497,
                              "src": "44001:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2567,
                              "name": "fees",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2506,
                              "src": "44010:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                "typeString": "uint256[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2568,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2499,
                              "src": "44016:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                                "typeString": "contract IERC20[] calldata"
                              },
                              {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              },
                              {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                "typeString": "uint256[] memory"
                              },
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2560,
                              "name": "borrower",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2488,
                              "src": "43955:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBatchFlashBorrower_$105",
                                "typeString": "contract IBatchFlashBorrower"
                              }
                            },
                            "id": 2562,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "onBatchFlashLoan",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 104,
                            "src": "43955:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_array$_t_contract$_IERC20_$72_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,contract IERC20[] memory,uint256[] memory,uint256[] memory,bytes memory) external"
                            }
                          },
                          "id": 2569,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43955:66:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2570,
                        "nodeType": "ExpressionStatement",
                        "src": "43955:66:0"
                      },
                      {
                        "body": {
                          "id": 2622,
                          "nodeType": "Block",
                          "src": "44066:257:0",
                          "statements": [
                            {
                              "assignments": [
                                2582
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2582,
                                  "mutability": "mutable",
                                  "name": "token",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2622,
                                  "src": "44080:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                    "typeString": "contract IERC20"
                                  },
                                  "typeName": {
                                    "contractScope": null,
                                    "id": 2581,
                                    "name": "IERC20",
                                    "nodeType": "UserDefinedTypeName",
                                    "referencedDeclaration": 72,
                                    "src": "44080:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2586,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2583,
                                  "name": "tokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2494,
                                  "src": "44095:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                                    "typeString": "contract IERC20[] calldata"
                                  }
                                },
                                "id": 2585,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2584,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2572,
                                  "src": "44102:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "44095:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "44080:24:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2601,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2589,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2582,
                                          "src": "44142:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        ],
                                        "id": 2588,
                                        "name": "_tokenBalanceOf",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1803,
                                        "src": "44126:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$72_$returns$_t_uint256_$",
                                          "typeString": "function (contract IERC20) view returns (uint256)"
                                        }
                                      },
                                      "id": 2590,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "44126:22:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": ">=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [],
                                          "expression": {
                                            "argumentTypes": [],
                                            "expression": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 2595,
                                                "name": "fees",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2506,
                                                "src": "44177:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                                  "typeString": "uint256[] memory"
                                                }
                                              },
                                              "id": 2597,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 2596,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2572,
                                                "src": "44182:1:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "44177:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 2598,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "to128",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 359,
                                            "src": "44177:13:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                              "typeString": "function (uint256) pure returns (uint128)"
                                            }
                                          },
                                          "id": 2599,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "44177:15:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2591,
                                            "name": "totals",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1710,
                                            "src": "44152:6:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                              "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                            }
                                          },
                                          "id": 2593,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2592,
                                            "name": "token",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2582,
                                            "src": "44159:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$72",
                                              "typeString": "contract IERC20"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "44152:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                            "typeString": "struct Rebase storage ref"
                                          }
                                        },
                                        "id": 2594,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "addElastic",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 878,
                                        "src": "44152:24:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$555_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_storage_ptr_$",
                                          "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                        }
                                      },
                                      "id": 2600,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "44152:41:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "44126:67:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a2057726f6e6720616d6f756e74",
                                    "id": 2602,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "44195:24:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                      "typeString": "literal_string \"BentoBox: Wrong amount\""
                                    },
                                    "value": "BentoBox: Wrong amount"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                      "typeString": "literal_string \"BentoBox: Wrong amount\""
                                    }
                                  ],
                                  "id": 2587,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "44118:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2603,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "44118:102:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2604,
                              "nodeType": "ExpressionStatement",
                              "src": "44118:102:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2608,
                                        "name": "borrower",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2488,
                                        "src": "44260:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IBatchFlashBorrower_$105",
                                          "typeString": "contract IBatchFlashBorrower"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IBatchFlashBorrower_$105",
                                          "typeString": "contract IBatchFlashBorrower"
                                        }
                                      ],
                                      "id": 2607,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "44252:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 2606,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "44252:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 2609,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "44252:17:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2610,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2582,
                                    "src": "44271:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2611,
                                      "name": "amounts",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2497,
                                      "src": "44278:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 2613,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2612,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2572,
                                      "src": "44286:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "44278:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2614,
                                      "name": "fees",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2506,
                                      "src": "44290:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                        "typeString": "uint256[] memory"
                                      }
                                    },
                                    "id": 2616,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2615,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2572,
                                      "src": "44295:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "44290:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2617,
                                      "name": "receivers",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2491,
                                      "src": "44299:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                        "typeString": "address[] calldata"
                                      }
                                    },
                                    "id": 2619,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2618,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2572,
                                      "src": "44309:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "44299:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 2605,
                                  "name": "LogFlashLoan",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1629,
                                  "src": "44239:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_contract$_IERC20_$72_$_t_uint256_$_t_uint256_$_t_address_$returns$__$",
                                    "typeString": "function (address,contract IERC20,uint256,uint256,address)"
                                  }
                                },
                                "id": 2620,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "44239:73:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2621,
                              "nodeType": "EmitStatement",
                              "src": "44234:78:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2577,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2575,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2572,
                            "src": "44052:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2576,
                            "name": "len",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2515,
                            "src": "44056:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "44052:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2623,
                        "initializationExpression": {
                          "assignments": [
                            2572
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2572,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2623,
                              "src": "44037:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2571,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "44037:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2574,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2573,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "44049:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "44037:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2579,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "44061:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2578,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2572,
                              "src": "44061:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2580,
                          "nodeType": "ExpressionStatement",
                          "src": "44061:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "44032:291:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2486,
                    "nodeType": "StructuredDocumentation",
                    "src": "42508:531:0",
                    "text": "@notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\n @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\n @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\n @param tokens The addresses of the tokens.\n @param amounts of the tokens for each receiver.\n @param data The calldata to pass to the `borrower` contract."
                  },
                  "functionSelector": "f483b3da",
                  "id": 2625,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "batchFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2500,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2488,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2625,
                        "src": "43430:28:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBatchFlashBorrower_$105",
                          "typeString": "contract IBatchFlashBorrower"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2487,
                          "name": "IBatchFlashBorrower",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 105,
                          "src": "43430:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IBatchFlashBorrower_$105",
                            "typeString": "contract IBatchFlashBorrower"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2491,
                        "mutability": "mutable",
                        "name": "receivers",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2625,
                        "src": "43468:28:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2489,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "43468:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 2490,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43468:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2494,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2625,
                        "src": "43506:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_calldata_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 2492,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 72,
                            "src": "43506:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 2493,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43506:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$72_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2497,
                        "mutability": "mutable",
                        "name": "amounts",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2625,
                        "src": "43540:26:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2495,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "43540:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2496,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43540:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2499,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2625,
                        "src": "43576:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2498,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "43576:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43420:181:0"
                  },
                  "returnParameters": {
                    "id": 2501,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43609:0:0"
                  },
                  "scope": 3106,
                  "src": "43397:932:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2654,
                    "nodeType": "Block",
                    "src": "44766:276:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2638,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2636,
                                "name": "targetPercentage_",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2630,
                                "src": "44802:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2637,
                                "name": "MAX_TARGET_PERCENTAGE",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1697,
                                "src": "44823:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "44802:42:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53747261746567794d616e616765723a2054617267657420746f6f2068696768",
                              "id": 2639,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "44846:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fa169a3b7ec1ea7a2a1a50e5f856d1f4ecd22f3eaba96fbdaee65d4d00485419",
                                "typeString": "literal_string \"StrategyManager: Target too high\""
                              },
                              "value": "StrategyManager: Target too high"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fa169a3b7ec1ea7a2a1a50e5f856d1f4ecd22f3eaba96fbdaee65d4d00485419",
                                "typeString": "literal_string \"StrategyManager: Target too high\""
                              }
                            ],
                            "id": 2635,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "44794:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2640,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44794:87:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2641,
                        "nodeType": "ExpressionStatement",
                        "src": "44794:87:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2647,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2642,
                                "name": "strategyData",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1722,
                                "src": "44911:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                                  "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                                }
                              },
                              "id": 2644,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2643,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2628,
                                "src": "44924:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "44911:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                                "typeString": "struct BentoBoxV1.StrategyData storage ref"
                              }
                            },
                            "id": 2645,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "targetPercentage",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1675,
                            "src": "44911:36:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2646,
                            "name": "targetPercentage_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2630,
                            "src": "44950:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "44911:56:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "id": 2648,
                        "nodeType": "ExpressionStatement",
                        "src": "44911:56:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2650,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2628,
                              "src": "45010:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2651,
                              "name": "targetPercentage_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2630,
                              "src": "45017:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              }
                            ],
                            "id": 2649,
                            "name": "LogStrategyTargetPercentage",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1635,
                            "src": "44982:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,uint256)"
                            }
                          },
                          "id": 2652,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44982:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2653,
                        "nodeType": "EmitStatement",
                        "src": "44977:58:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2626,
                    "nodeType": "StructuredDocumentation",
                    "src": "44335:332:0",
                    "text": "@notice Sets the target percentage of the strategy for `token`.\n @dev Only the owner of this contract is allowed to change this.\n @param token The address of the token that maps to a strategy to change.\n @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`."
                  },
                  "functionSelector": "3e2a9d4e",
                  "id": 2655,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 2633,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2632,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1030,
                        "src": "44756:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "44756:9:0"
                    }
                  ],
                  "name": "setStrategyTargetPercentage",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2631,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2628,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2655,
                        "src": "44709:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2627,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "44709:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2630,
                        "mutability": "mutable",
                        "name": "targetPercentage_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2655,
                        "src": "44723:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 2629,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "44723:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44708:40:0"
                  },
                  "returnParameters": {
                    "id": 2634,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "44766:0:0"
                  },
                  "scope": 3106,
                  "src": "44672:370:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2840,
                    "nodeType": "Block",
                    "src": "45918:1583:0",
                    "statements": [
                      {
                        "assignments": [
                          2666
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2666,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2840,
                            "src": "45928:24:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2665,
                              "name": "StrategyData",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1678,
                              "src": "45928:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StrategyData_$1678_storage_ptr",
                                "typeString": "struct BentoBoxV1.StrategyData"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2670,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2667,
                            "name": "strategyData",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1722,
                            "src": "45955:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                              "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                            }
                          },
                          "id": 2669,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2668,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2658,
                            "src": "45968:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "45955:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "45928:46:0"
                      },
                      {
                        "assignments": [
                          2672
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2672,
                            "mutability": "mutable",
                            "name": "pending",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2840,
                            "src": "45984:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IStrategy_$147",
                              "typeString": "contract IStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2671,
                              "name": "IStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 147,
                              "src": "45984:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$147",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2676,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2673,
                            "name": "pendingStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1718,
                            "src": "46004:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                              "typeString": "mapping(contract IERC20 => contract IStrategy)"
                            }
                          },
                          "id": 2675,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2674,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2658,
                            "src": "46020:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "46004:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$147",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "45984:42:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 2684,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            },
                            "id": 2680,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2677,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2666,
                                "src": "46040:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                  "typeString": "struct BentoBoxV1.StrategyData memory"
                                }
                              },
                              "id": 2678,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "strategyStartDate",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1673,
                              "src": "46040:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2679,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "46066:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "46040:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "||",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_contract$_IStrategy_$147",
                              "typeString": "contract IStrategy"
                            },
                            "id": 2683,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2681,
                              "name": "pending",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2672,
                              "src": "46071:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$147",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2682,
                              "name": "newStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2660,
                              "src": "46082:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$147",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "src": "46071:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "46040:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2832,
                          "nodeType": "Block",
                          "src": "46438:1021:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 2719,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      },
                                      "id": 2713,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2710,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2666,
                                          "src": "46460:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 2711,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "strategyStartDate",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1673,
                                        "src": "46460:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "!=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 2712,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "46486:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "46460:27:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "&&",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 2718,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2714,
                                          "name": "block",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -4,
                                          "src": "46491:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_block",
                                            "typeString": "block"
                                          }
                                        },
                                        "id": 2715,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "timestamp",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "46491:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": ">=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2716,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2666,
                                          "src": "46510:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 2717,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "strategyStartDate",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1673,
                                        "src": "46510:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "46491:41:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "46460:72:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "53747261746567794d616e616765723a20546f6f206561726c79",
                                    "id": 2720,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "46534:28:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_90881d0adc7ac2d6397f1fee49db9e56cb6d6db8a51f54dd8223c6e98e46c87d",
                                      "typeString": "literal_string \"StrategyManager: Too early\""
                                    },
                                    "value": "StrategyManager: Too early"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_90881d0adc7ac2d6397f1fee49db9e56cb6d6db8a51f54dd8223c6e98e46c87d",
                                      "typeString": "literal_string \"StrategyManager: Too early\""
                                    }
                                  ],
                                  "id": 2709,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "46452:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2721,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "46452:111:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2722,
                              "nodeType": "ExpressionStatement",
                              "src": "46452:111:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 2733,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2725,
                                        "name": "strategy",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1714,
                                        "src": "46589:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                                          "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                        }
                                      },
                                      "id": 2727,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2726,
                                        "name": "token",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2658,
                                        "src": "46598:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC20_$72",
                                          "typeString": "contract IERC20"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "46589:15:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IStrategy_$147",
                                        "typeString": "contract IStrategy"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IStrategy_$147",
                                        "typeString": "contract IStrategy"
                                      }
                                    ],
                                    "id": 2724,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "46581:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 2723,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "46581:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2728,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "46581:24:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 2731,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "46617:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 2730,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "46609:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 2729,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "46609:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2732,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "46609:10:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "46581:38:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 2800,
                              "nodeType": "IfStatement",
                              "src": "46577:659:0",
                              "trueBody": {
                                "id": 2799,
                                "nodeType": "Block",
                                "src": "46621:615:0",
                                "statements": [
                                  {
                                    "assignments": [
                                      2735
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 2735,
                                        "mutability": "mutable",
                                        "name": "balanceChange",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 2799,
                                        "src": "46639:20:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        },
                                        "typeName": {
                                          "id": 2734,
                                          "name": "int256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "46639:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_int256",
                                            "typeString": "int256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 2743,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2740,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2666,
                                            "src": "46683:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 2741,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1677,
                                          "src": "46683:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2736,
                                            "name": "strategy",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1714,
                                            "src": "46662:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                                              "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                            }
                                          },
                                          "id": 2738,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2737,
                                            "name": "token",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2658,
                                            "src": "46671:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$72",
                                              "typeString": "contract IERC20"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "46662:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IStrategy_$147",
                                            "typeString": "contract IStrategy"
                                          }
                                        },
                                        "id": 2739,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "exit",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 146,
                                        "src": "46662:20:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_int256_$",
                                          "typeString": "function (uint256) external returns (int256)"
                                        }
                                      },
                                      "id": 2742,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "46662:34:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "46639:57:0"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      },
                                      "id": 2746,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 2744,
                                        "name": "balanceChange",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2735,
                                        "src": "46745:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": ">",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 2745,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "46761:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "46745:17:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": {
                                      "condition": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        },
                                        "id": 2769,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2767,
                                          "name": "balanceChange",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2735,
                                          "src": "46958:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_int256",
                                            "typeString": "int256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "<",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 2768,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "46974:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        "src": "46958:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "falseBody": null,
                                      "id": 2791,
                                      "nodeType": "IfStatement",
                                      "src": "46954:206:0",
                                      "trueBody": {
                                        "id": 2790,
                                        "nodeType": "Block",
                                        "src": "46977:183:0",
                                        "statements": [
                                          {
                                            "assignments": [
                                              2771
                                            ],
                                            "declarations": [
                                              {
                                                "constant": false,
                                                "id": 2771,
                                                "mutability": "mutable",
                                                "name": "sub",
                                                "nodeType": "VariableDeclaration",
                                                "overrides": null,
                                                "scope": 2790,
                                                "src": "46999:11:0",
                                                "stateVariable": false,
                                                "storageLocation": "default",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                "typeName": {
                                                  "id": 2770,
                                                  "name": "uint256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "46999:7:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "value": null,
                                                "visibility": "internal"
                                              }
                                            ],
                                            "id": 2777,
                                            "initialValue": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2775,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "UnaryOperation",
                                                  "operator": "-",
                                                  "prefix": true,
                                                  "src": "47021:14:0",
                                                  "subExpression": {
                                                    "argumentTypes": null,
                                                    "id": 2774,
                                                    "name": "balanceChange",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 2735,
                                                    "src": "47022:13:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_int256",
                                                      "typeString": "int256"
                                                    }
                                                  },
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  }
                                                ],
                                                "id": 2773,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "47013:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_uint256_$",
                                                  "typeString": "type(uint256)"
                                                },
                                                "typeName": {
                                                  "id": 2772,
                                                  "name": "uint256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "47013:7:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": null,
                                                    "typeString": null
                                                  }
                                                }
                                              },
                                              "id": 2776,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "47013:23:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "VariableDeclarationStatement",
                                            "src": "46999:37:0"
                                          },
                                          {
                                            "expression": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2782,
                                                  "name": "sub",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2771,
                                                  "src": "47083:3:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "baseExpression": {
                                                    "argumentTypes": null,
                                                    "id": 2778,
                                                    "name": "totals",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 1710,
                                                    "src": "47058:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                                      "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                                    }
                                                  },
                                                  "id": 2780,
                                                  "indexExpression": {
                                                    "argumentTypes": null,
                                                    "id": 2779,
                                                    "name": "token",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 2658,
                                                    "src": "47065:5:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                                      "typeString": "contract IERC20"
                                                    }
                                                  },
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "IndexAccess",
                                                  "src": "47058:13:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                                    "typeString": "struct Rebase storage ref"
                                                  }
                                                },
                                                "id": 2781,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "subElastic",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 902,
                                                "src": "47058:24:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$555_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_storage_ptr_$",
                                                  "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                                }
                                              },
                                              "id": 2783,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "47058:29:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 2784,
                                            "nodeType": "ExpressionStatement",
                                            "src": "47058:29:0"
                                          },
                                          {
                                            "eventCall": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2786,
                                                  "name": "token",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2658,
                                                  "src": "47130:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                                    "typeString": "contract IERC20"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2787,
                                                  "name": "sub",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2771,
                                                  "src": "47137:3:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                                    "typeString": "contract IERC20"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "id": 2785,
                                                "name": "LogStrategyLoss",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1671,
                                                "src": "47114:15:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                                                  "typeString": "function (contract IERC20,uint256)"
                                                }
                                              },
                                              "id": 2788,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "47114:27:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$__$",
                                                "typeString": "tuple()"
                                              }
                                            },
                                            "id": 2789,
                                            "nodeType": "EmitStatement",
                                            "src": "47109:32:0"
                                          }
                                        ]
                                      }
                                    },
                                    "id": 2792,
                                    "nodeType": "IfStatement",
                                    "src": "46741:419:0",
                                    "trueBody": {
                                      "id": 2766,
                                      "nodeType": "Block",
                                      "src": "46764:184:0",
                                      "statements": [
                                        {
                                          "assignments": [
                                            2748
                                          ],
                                          "declarations": [
                                            {
                                              "constant": false,
                                              "id": 2748,
                                              "mutability": "mutable",
                                              "name": "add",
                                              "nodeType": "VariableDeclaration",
                                              "overrides": null,
                                              "scope": 2766,
                                              "src": "46786:11:0",
                                              "stateVariable": false,
                                              "storageLocation": "default",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "typeName": {
                                                "id": 2747,
                                                "name": "uint256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "46786:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "value": null,
                                              "visibility": "internal"
                                            }
                                          ],
                                          "id": 2753,
                                          "initialValue": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 2751,
                                                "name": "balanceChange",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2735,
                                                "src": "46808:13:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_int256",
                                                  "typeString": "int256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_int256",
                                                  "typeString": "int256"
                                                }
                                              ],
                                              "id": 2750,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "46800:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_uint256_$",
                                                "typeString": "type(uint256)"
                                              },
                                              "typeName": {
                                                "id": 2749,
                                                "name": "uint256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "46800:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            "id": 2752,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "46800:22:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "VariableDeclarationStatement",
                                          "src": "46786:36:0"
                                        },
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 2758,
                                                "name": "add",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2748,
                                                "src": "46869:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "baseExpression": {
                                                  "argumentTypes": null,
                                                  "id": 2754,
                                                  "name": "totals",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 1710,
                                                  "src": "46844:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                                    "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                                  }
                                                },
                                                "id": 2756,
                                                "indexExpression": {
                                                  "argumentTypes": null,
                                                  "id": 2755,
                                                  "name": "token",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2658,
                                                  "src": "46851:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IERC20_$72",
                                                    "typeString": "contract IERC20"
                                                  }
                                                },
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "IndexAccess",
                                                "src": "46844:13:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                                  "typeString": "struct Rebase storage ref"
                                                }
                                              },
                                              "id": 2757,
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "addElastic",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 878,
                                              "src": "46844:24:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$555_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$555_storage_ptr_$",
                                                "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                              }
                                            },
                                            "id": 2759,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "46844:29:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2760,
                                          "nodeType": "ExpressionStatement",
                                          "src": "46844:29:0"
                                        },
                                        {
                                          "eventCall": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 2762,
                                                "name": "token",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2658,
                                                "src": "46918:5:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                                  "typeString": "contract IERC20"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 2763,
                                                "name": "add",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2748,
                                                "src": "46925:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_contract$_IERC20_$72",
                                                  "typeString": "contract IERC20"
                                                },
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "id": 2761,
                                              "name": "LogStrategyProfit",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 1665,
                                              "src": "46900:17:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                                                "typeString": "function (contract IERC20,uint256)"
                                              }
                                            },
                                            "id": 2764,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "46900:29:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_tuple$__$",
                                              "typeString": "tuple()"
                                            }
                                          },
                                          "id": 2765,
                                          "nodeType": "EmitStatement",
                                          "src": "46895:34:0"
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2794,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2658,
                                          "src": "47201:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2795,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2666,
                                            "src": "47208:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 2796,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1677,
                                          "src": "47208:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          },
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "id": 2793,
                                        "name": "LogStrategyDivest",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1659,
                                        "src": "47183:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                                          "typeString": "function (contract IERC20,uint256)"
                                        }
                                      },
                                      "id": 2797,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "47183:38:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 2798,
                                    "nodeType": "EmitStatement",
                                    "src": "47178:43:0"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2805,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2801,
                                    "name": "strategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1714,
                                    "src": "47249:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                    }
                                  },
                                  "id": 2803,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2802,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2658,
                                    "src": "47258:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "47249:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$147",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2804,
                                  "name": "pending",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2672,
                                  "src": "47267:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$147",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "src": "47249:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IStrategy_$147",
                                  "typeString": "contract IStrategy"
                                }
                              },
                              "id": 2806,
                              "nodeType": "ExpressionStatement",
                              "src": "47249:25:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2811,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2807,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2666,
                                    "src": "47288:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2809,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "strategyStartDate",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1673,
                                  "src": "47288:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2810,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47313:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "47288:26:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "id": 2812,
                              "nodeType": "ExpressionStatement",
                              "src": "47288:26:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2817,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2813,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2666,
                                    "src": "47328:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2815,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "balance",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1677,
                                  "src": "47328:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2816,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47343:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "47328:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2818,
                              "nodeType": "ExpressionStatement",
                              "src": "47328:16:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2825,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2819,
                                    "name": "pendingStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1718,
                                    "src": "47358:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                    }
                                  },
                                  "id": 2821,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2820,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2658,
                                    "src": "47374:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "47358:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$147",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 2823,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "47393:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 2822,
                                    "name": "IStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 147,
                                    "src": "47383:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IStrategy_$147_$",
                                      "typeString": "type(contract IStrategy)"
                                    }
                                  },
                                  "id": 2824,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "47383:12:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$147",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "src": "47358:37:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IStrategy_$147",
                                  "typeString": "contract IStrategy"
                                }
                              },
                              "id": 2826,
                              "nodeType": "ExpressionStatement",
                              "src": "47358:37:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2828,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2658,
                                    "src": "47429:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2829,
                                    "name": "newStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2660,
                                    "src": "47436:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IStrategy_$147",
                                      "typeString": "contract IStrategy"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_contract$_IStrategy_$147",
                                      "typeString": "contract IStrategy"
                                    }
                                  ],
                                  "id": 2827,
                                  "name": "LogStrategySet",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1647,
                                  "src": "47414:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$returns$__$",
                                    "typeString": "function (contract IERC20,contract IStrategy)"
                                  }
                                },
                                "id": 2830,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "47414:34:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2831,
                              "nodeType": "EmitStatement",
                              "src": "47409:39:0"
                            }
                          ]
                        },
                        "id": 2833,
                        "nodeType": "IfStatement",
                        "src": "46036:1423:0",
                        "trueBody": {
                          "id": 2708,
                          "nodeType": "Block",
                          "src": "46095:337:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2689,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2685,
                                    "name": "pendingStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1718,
                                    "src": "46109:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                    }
                                  },
                                  "id": 2687,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2686,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2658,
                                    "src": "46125:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "46109:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$147",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2688,
                                  "name": "newStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2660,
                                  "src": "46134:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$147",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "src": "46109:36:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IStrategy_$147",
                                  "typeString": "contract IStrategy"
                                }
                              },
                              "id": 2690,
                              "nodeType": "ExpressionStatement",
                              "src": "46109:36:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2701,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2691,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2666,
                                    "src": "46299:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2693,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "strategyStartDate",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1673,
                                  "src": "46299:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "components": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 2697,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 2694,
                                              "name": "block",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -4,
                                              "src": "46325:5:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_block",
                                                "typeString": "block"
                                              }
                                            },
                                            "id": 2695,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "timestamp",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "46325:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "+",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 2696,
                                            "name": "STRATEGY_DELAY",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1694,
                                            "src": "46343:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "46325:32:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "id": 2698,
                                      "isConstant": false,
                                      "isInlineArray": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "TupleExpression",
                                      "src": "46324:34:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2699,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to64",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 385,
                                    "src": "46324:39:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint64)"
                                    }
                                  },
                                  "id": 2700,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "46324:41:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "src": "46299:66:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "id": 2702,
                              "nodeType": "ExpressionStatement",
                              "src": "46299:66:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2704,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2658,
                                    "src": "46402:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2705,
                                    "name": "newStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2660,
                                    "src": "46409:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IStrategy_$147",
                                      "typeString": "contract IStrategy"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_contract$_IStrategy_$147",
                                      "typeString": "contract IStrategy"
                                    }
                                  ],
                                  "id": 2703,
                                  "name": "LogStrategyQueued",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1641,
                                  "src": "46384:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$returns$__$",
                                    "typeString": "function (contract IERC20,contract IStrategy)"
                                  }
                                },
                                "id": 2706,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "46384:37:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2707,
                              "nodeType": "EmitStatement",
                              "src": "46379:42:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2838,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2834,
                              "name": "strategyData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1722,
                              "src": "47468:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                                "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                              }
                            },
                            "id": 2836,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2835,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2658,
                              "src": "47481:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "47468:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                              "typeString": "struct BentoBoxV1.StrategyData storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2837,
                            "name": "data",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2666,
                            "src": "47490:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData memory"
                            }
                          },
                          "src": "47468:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "id": 2839,
                        "nodeType": "ExpressionStatement",
                        "src": "47468:26:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2656,
                    "nodeType": "StructuredDocumentation",
                    "src": "45048:486:0",
                    "text": "@notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\n Must be called twice with the same arguments.\n A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\n @dev Only the owner of this contract is allowed to change this.\n @param token The address of the token that maps to a strategy to change.\n @param newStrategy The address of the contract that conforms to `IStrategy`."
                  },
                  "functionSelector": "72cb5d97",
                  "id": 2841,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 2663,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2662,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1030,
                        "src": "45908:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "45908:9:0"
                    }
                  ],
                  "name": "setStrategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2661,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2658,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2841,
                        "src": "45864:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2657,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "45864:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2660,
                        "mutability": "mutable",
                        "name": "newStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2841,
                        "src": "45878:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$147",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2659,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 147,
                          "src": "45878:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$147",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45863:37:0"
                  },
                  "returnParameters": {
                    "id": 2664,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45918:0:0"
                  },
                  "scope": 3106,
                  "src": "45843:1658:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3100,
                    "nodeType": "Block",
                    "src": "48348:2314:0",
                    "statements": [
                      {
                        "assignments": [
                          2852
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2852,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3100,
                            "src": "48358:24:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2851,
                              "name": "StrategyData",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1678,
                              "src": "48358:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StrategyData_$1678_storage_ptr",
                                "typeString": "struct BentoBoxV1.StrategyData"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2856,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2853,
                            "name": "strategyData",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1722,
                            "src": "48385:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                              "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                            }
                          },
                          "id": 2855,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2854,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2844,
                            "src": "48398:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "48385:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48358:46:0"
                      },
                      {
                        "assignments": [
                          2858
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2858,
                            "mutability": "mutable",
                            "name": "_strategy",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3100,
                            "src": "48414:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IStrategy_$147",
                              "typeString": "contract IStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2857,
                              "name": "IStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 147,
                              "src": "48414:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$147",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2862,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2859,
                            "name": "strategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1714,
                            "src": "48436:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_contract$_IStrategy_$147_$",
                              "typeString": "mapping(contract IERC20 => contract IStrategy)"
                            }
                          },
                          "id": 2861,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2860,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2844,
                            "src": "48445:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$72",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "48436:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$147",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48414:37:0"
                      },
                      {
                        "assignments": [
                          2864
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2864,
                            "mutability": "mutable",
                            "name": "balanceChange",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3100,
                            "src": "48461:20:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "typeName": {
                              "id": 2863,
                              "name": "int256",
                              "nodeType": "ElementaryTypeName",
                              "src": "48461:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2872,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2867,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2852,
                                "src": "48502:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                  "typeString": "struct BentoBoxV1.StrategyData memory"
                                }
                              },
                              "id": 2868,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "balance",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1677,
                              "src": "48502:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2869,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "48516:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2870,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "48516:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2865,
                              "name": "_strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2858,
                              "src": "48484:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$147",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "id": 2866,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "harvest",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 130,
                            "src": "48484:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$returns$_t_int256_$",
                              "typeString": "function (uint256,address) external returns (int256)"
                            }
                          },
                          "id": 2871,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48484:43:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48461:66:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 2878,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "id": 2875,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2873,
                              "name": "balanceChange",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2864,
                              "src": "48541:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2874,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "48558:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "48541:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2877,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "!",
                            "prefix": true,
                            "src": "48563:8:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2876,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2846,
                              "src": "48564:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "48541:30:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2881,
                        "nodeType": "IfStatement",
                        "src": "48537:67:0",
                        "trueBody": {
                          "id": 2880,
                          "nodeType": "Block",
                          "src": "48573:31:0",
                          "statements": [
                            {
                              "expression": null,
                              "functionReturnParameters": 2850,
                              "id": 2879,
                              "nodeType": "Return",
                              "src": "48587:7:0"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          2883
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2883,
                            "mutability": "mutable",
                            "name": "totalElastic",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3100,
                            "src": "48614:20:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2882,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "48614:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2888,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2884,
                              "name": "totals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1710,
                              "src": "48637:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                              }
                            },
                            "id": 2886,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2885,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2844,
                              "src": "48644:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "48637:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$555_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "id": 2887,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "elastic",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 552,
                          "src": "48637:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48614:44:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          },
                          "id": 2891,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2889,
                            "name": "balanceChange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2864,
                            "src": "48673:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2890,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "48689:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "48673:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "id": 2923,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2921,
                              "name": "balanceChange",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2864,
                              "src": "48919:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "<",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2922,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "48935:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "48919:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": null,
                          "id": 2966,
                          "nodeType": "IfStatement",
                          "src": "48915:523:0",
                          "trueBody": {
                            "id": 2965,
                            "nodeType": "Block",
                            "src": "48938:500:0",
                            "statements": [
                              {
                                "assignments": [
                                  2925
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2925,
                                    "mutability": "mutable",
                                    "name": "sub",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2965,
                                    "src": "49178:11:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2924,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "49178:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2931,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2929,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "-",
                                      "prefix": true,
                                      "src": "49200:14:0",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "id": 2928,
                                        "name": "balanceChange",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2864,
                                        "src": "49201:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    ],
                                    "id": 2927,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "49192:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 2926,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "49192:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2930,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49192:23:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "49178:37:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2937,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "id": 2932,
                                    "name": "totalElastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2883,
                                    "src": "49229:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2935,
                                        "name": "sub",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2925,
                                        "src": "49261:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2933,
                                        "name": "totalElastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2883,
                                        "src": "49244:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2934,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 305,
                                      "src": "49244:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 2936,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "49244:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "49229:36:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2938,
                                "nodeType": "ExpressionStatement",
                                "src": "49229:36:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2946,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2939,
                                        "name": "totals",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1710,
                                        "src": "49279:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                          "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                        }
                                      },
                                      "id": 2941,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2940,
                                        "name": "token",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2844,
                                        "src": "49286:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC20_$72",
                                          "typeString": "contract IERC20"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "49279:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                        "typeString": "struct Rebase storage ref"
                                      }
                                    },
                                    "id": 2942,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": true,
                                    "memberName": "elastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 552,
                                    "src": "49279:21:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2943,
                                        "name": "totalElastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2883,
                                        "src": "49303:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2944,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "to128",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 359,
                                      "src": "49303:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256) pure returns (uint128)"
                                      }
                                    },
                                    "id": 2945,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "49303:20:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "49279:44:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 2947,
                                "nodeType": "ExpressionStatement",
                                "src": "49279:44:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2958,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2948,
                                      "name": "data",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2852,
                                      "src": "49337:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                        "typeString": "struct BentoBoxV1.StrategyData memory"
                                      }
                                    },
                                    "id": 2950,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": true,
                                    "memberName": "balance",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1677,
                                    "src": "49337:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [],
                                        "expression": {
                                          "argumentTypes": [],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2954,
                                            "name": "sub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2925,
                                            "src": "49369:3:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2955,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "to128",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 359,
                                          "src": "49369:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256) pure returns (uint128)"
                                          }
                                        },
                                        "id": 2956,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "49369:11:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2951,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2852,
                                          "src": "49352:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 2952,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "balance",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1677,
                                        "src": "49352:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "id": 2953,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 457,
                                      "src": "49352:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                        "typeString": "function (uint128,uint128) pure returns (uint128)"
                                      }
                                    },
                                    "id": 2957,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "49352:29:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "49337:44:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 2959,
                                "nodeType": "ExpressionStatement",
                                "src": "49337:44:0"
                              },
                              {
                                "eventCall": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2961,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2844,
                                      "src": "49416:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$72",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 2962,
                                      "name": "sub",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2925,
                                      "src": "49423:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IERC20_$72",
                                        "typeString": "contract IERC20"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 2960,
                                    "name": "LogStrategyLoss",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1671,
                                    "src": "49400:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                                      "typeString": "function (contract IERC20,uint256)"
                                    }
                                  },
                                  "id": 2963,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49400:27:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_tuple$__$",
                                    "typeString": "tuple()"
                                  }
                                },
                                "id": 2964,
                                "nodeType": "EmitStatement",
                                "src": "49395:32:0"
                              }
                            ]
                          }
                        },
                        "id": 2967,
                        "nodeType": "IfStatement",
                        "src": "48669:769:0",
                        "trueBody": {
                          "id": 2920,
                          "nodeType": "Block",
                          "src": "48692:217:0",
                          "statements": [
                            {
                              "assignments": [
                                2893
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2893,
                                  "mutability": "mutable",
                                  "name": "add",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2920,
                                  "src": "48706:11:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2892,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "48706:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2898,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2896,
                                    "name": "balanceChange",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2864,
                                    "src": "48728:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    }
                                  ],
                                  "id": 2895,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "48720:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint256_$",
                                    "typeString": "type(uint256)"
                                  },
                                  "typeName": {
                                    "id": 2894,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "48720:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2897,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "48720:22:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "48706:36:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2904,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2899,
                                  "name": "totalElastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2883,
                                  "src": "48756:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2902,
                                      "name": "add",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2893,
                                      "src": "48788:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2900,
                                      "name": "totalElastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2883,
                                      "src": "48771:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2901,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 283,
                                    "src": "48771:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2903,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "48771:21:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "48756:36:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2905,
                              "nodeType": "ExpressionStatement",
                              "src": "48756:36:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2913,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2906,
                                      "name": "totals",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1710,
                                      "src": "48806:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_Rebase_$555_storage_$",
                                        "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                      }
                                    },
                                    "id": 2908,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2907,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2844,
                                      "src": "48813:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$72",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "48806:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$555_storage",
                                      "typeString": "struct Rebase storage ref"
                                    }
                                  },
                                  "id": 2909,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 552,
                                  "src": "48806:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2910,
                                      "name": "totalElastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2883,
                                      "src": "48830:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2911,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to128",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 359,
                                    "src": "48830:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint128)"
                                    }
                                  },
                                  "id": 2912,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "48830:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "src": "48806:44:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2914,
                              "nodeType": "ExpressionStatement",
                              "src": "48806:44:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2916,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2844,
                                    "src": "48887:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2917,
                                    "name": "add",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2893,
                                    "src": "48894:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$72",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2915,
                                  "name": "LogStrategyProfit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1665,
                                  "src": "48869:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,uint256)"
                                  }
                                },
                                "id": 2918,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "48869:29:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2919,
                              "nodeType": "EmitStatement",
                              "src": "48864:34:0"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 2968,
                          "name": "balance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2846,
                          "src": "49452:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 3093,
                        "nodeType": "IfStatement",
                        "src": "49448:1171:0",
                        "trueBody": {
                          "id": 3092,
                          "nodeType": "Block",
                          "src": "49461:1158:0",
                          "statements": [
                            {
                              "assignments": [
                                2970
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2970,
                                  "mutability": "mutable",
                                  "name": "targetBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 3092,
                                  "src": "49475:21:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2969,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "49475:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2978,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2977,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2973,
                                        "name": "data",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2852,
                                        "src": "49516:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                          "typeString": "struct BentoBoxV1.StrategyData memory"
                                        }
                                      },
                                      "id": 2974,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "targetPercentage",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1675,
                                      "src": "49516:21:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2971,
                                      "name": "totalElastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2883,
                                      "src": "49499:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2972,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 333,
                                    "src": "49499:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2975,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49499:39:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "/",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "313030",
                                  "id": 2976,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49541:3:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_100_by_1",
                                    "typeString": "int_const 100"
                                  },
                                  "value": "100"
                                },
                                "src": "49499:45:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "49475:69:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2982,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2979,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2852,
                                    "src": "49637:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2980,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "balance",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1677,
                                  "src": "49637:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2981,
                                  "name": "targetBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2970,
                                  "src": "49652:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "49637:28:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 3041,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3038,
                                      "name": "data",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2852,
                                      "src": "50139:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                        "typeString": "struct BentoBoxV1.StrategyData memory"
                                      }
                                    },
                                    "id": 3039,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "balance",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1677,
                                    "src": "50139:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 3040,
                                    "name": "targetBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2970,
                                    "src": "50154:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "50139:28:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseBody": null,
                                "id": 3090,
                                "nodeType": "IfStatement",
                                "src": "50135:474:0",
                                "trueBody": {
                                  "id": 3089,
                                  "nodeType": "Block",
                                  "src": "50169:440:0",
                                  "statements": [
                                    {
                                      "assignments": [
                                        3043
                                      ],
                                      "declarations": [
                                        {
                                          "constant": false,
                                          "id": 3043,
                                          "mutability": "mutable",
                                          "name": "amountIn",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 3089,
                                          "src": "50187:16:0",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "typeName": {
                                            "id": 3042,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "50187:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        }
                                      ],
                                      "id": 3051,
                                      "initialValue": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "arguments": [],
                                            "expression": {
                                              "argumentTypes": [],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3047,
                                                "name": "targetBalance",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2970,
                                                "src": "50223:13:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "id": 3048,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "to128",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 359,
                                              "src": "50223:19:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                                "typeString": "function (uint256) pure returns (uint128)"
                                              }
                                            },
                                            "id": 3049,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "50223:21:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3044,
                                              "name": "data",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2852,
                                              "src": "50206:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                                "typeString": "struct BentoBoxV1.StrategyData memory"
                                              }
                                            },
                                            "id": 3045,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "balance",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 1677,
                                            "src": "50206:12:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          },
                                          "id": 3046,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "sub",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 457,
                                          "src": "50206:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                            "typeString": "function (uint128,uint128) pure returns (uint128)"
                                          }
                                        },
                                        "id": 3050,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "50206:39:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "VariableDeclarationStatement",
                                      "src": "50187:58:0"
                                    },
                                    {
                                      "condition": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        "id": 3058,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 3054,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 3052,
                                            "name": "maxChangeAmount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2848,
                                            "src": "50267:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "!=",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "hexValue": "30",
                                            "id": 3053,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "50286:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_0_by_1",
                                              "typeString": "int_const 0"
                                            },
                                            "value": "0"
                                          },
                                          "src": "50267:20:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "&&",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 3057,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 3055,
                                            "name": "amountIn",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3043,
                                            "src": "50291:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": ">",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 3056,
                                            "name": "maxChangeAmount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2848,
                                            "src": "50302:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "50291:26:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "src": "50267:50:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "falseBody": null,
                                      "id": 3064,
                                      "nodeType": "IfStatement",
                                      "src": "50263:123:0",
                                      "trueBody": {
                                        "id": 3063,
                                        "nodeType": "Block",
                                        "src": "50319:67:0",
                                        "statements": [
                                          {
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3061,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftHandSide": {
                                                "argumentTypes": null,
                                                "id": 3059,
                                                "name": "amountIn",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3043,
                                                "src": "50341:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "nodeType": "Assignment",
                                              "operator": "=",
                                              "rightHandSide": {
                                                "argumentTypes": null,
                                                "id": 3060,
                                                "name": "maxChangeAmount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2848,
                                                "src": "50352:15:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "src": "50341:26:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 3062,
                                            "nodeType": "ExpressionStatement",
                                            "src": "50341:26:0"
                                          }
                                        ]
                                      }
                                    },
                                    {
                                      "assignments": [
                                        3066
                                      ],
                                      "declarations": [
                                        {
                                          "constant": false,
                                          "id": 3066,
                                          "mutability": "mutable",
                                          "name": "actualAmountIn",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 3089,
                                          "src": "50404:22:0",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "typeName": {
                                            "id": 3065,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "50404:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        }
                                      ],
                                      "id": 3071,
                                      "initialValue": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 3069,
                                            "name": "amountIn",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3043,
                                            "src": "50448:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 3067,
                                            "name": "_strategy",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2858,
                                            "src": "50429:9:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IStrategy_$147",
                                              "typeString": "contract IStrategy"
                                            }
                                          },
                                          "id": 3068,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "withdraw",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 138,
                                          "src": "50429:18:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                            "typeString": "function (uint256) external returns (uint256)"
                                          }
                                        },
                                        "id": 3070,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "50429:28:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "VariableDeclarationStatement",
                                      "src": "50404:53:0"
                                    },
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 3082,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 3072,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2852,
                                            "src": "50476:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 3074,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": true,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1677,
                                          "src": "50476:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "arguments": [],
                                              "expression": {
                                                "argumentTypes": [],
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 3078,
                                                  "name": "actualAmountIn",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3066,
                                                  "src": "50508:14:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "id": 3079,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "to128",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 359,
                                                "src": "50508:20:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                                  "typeString": "function (uint256) pure returns (uint128)"
                                                }
                                              },
                                              "id": 3080,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "50508:22:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint128",
                                                "typeString": "uint128"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint128",
                                                "typeString": "uint128"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3075,
                                                "name": "data",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2852,
                                                "src": "50491:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                                  "typeString": "struct BentoBoxV1.StrategyData memory"
                                                }
                                              },
                                              "id": 3076,
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "balance",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 1677,
                                              "src": "50491:12:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint128",
                                                "typeString": "uint128"
                                              }
                                            },
                                            "id": 3077,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sub",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 457,
                                            "src": "50491:16:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                              "typeString": "function (uint128,uint128) pure returns (uint128)"
                                            }
                                          },
                                          "id": 3081,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "50491:40:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        },
                                        "src": "50476:55:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "id": 3083,
                                      "nodeType": "ExpressionStatement",
                                      "src": "50476:55:0"
                                    },
                                    {
                                      "eventCall": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 3085,
                                            "name": "token",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2844,
                                            "src": "50572:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$72",
                                              "typeString": "contract IERC20"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 3086,
                                            "name": "actualAmountIn",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3066,
                                            "src": "50579:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_IERC20_$72",
                                              "typeString": "contract IERC20"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "id": 3084,
                                          "name": "LogStrategyDivest",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1659,
                                          "src": "50554:17:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                                            "typeString": "function (contract IERC20,uint256)"
                                          }
                                        },
                                        "id": 3087,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "50554:40:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_tuple$__$",
                                          "typeString": "tuple()"
                                        }
                                      },
                                      "id": 3088,
                                      "nodeType": "EmitStatement",
                                      "src": "50549:45:0"
                                    }
                                  ]
                                }
                              },
                              "id": 3091,
                              "nodeType": "IfStatement",
                              "src": "49633:976:0",
                              "trueBody": {
                                "id": 3037,
                                "nodeType": "Block",
                                "src": "49667:462:0",
                                "statements": [
                                  {
                                    "assignments": [
                                      2984
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 2984,
                                        "mutability": "mutable",
                                        "name": "amountOut",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 3037,
                                        "src": "49685:17:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 2983,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "49685:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 2990,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2987,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2852,
                                            "src": "49723:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 2988,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1677,
                                          "src": "49723:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2985,
                                          "name": "targetBalance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2970,
                                          "src": "49705:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2986,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sub",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 305,
                                        "src": "49705:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 2989,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "49705:31:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "49685:51:0"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "id": 2997,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2993,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2991,
                                          "name": "maxChangeAmount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2848,
                                          "src": "49758:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "!=",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 2992,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "49777:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        "src": "49758:20:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "&&",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2996,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2994,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2984,
                                          "src": "49782:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": ">",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 2995,
                                          "name": "maxChangeAmount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2848,
                                          "src": "49794:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "49782:27:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "src": "49758:51:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 3003,
                                    "nodeType": "IfStatement",
                                    "src": "49754:125:0",
                                    "trueBody": {
                                      "id": 3002,
                                      "nodeType": "Block",
                                      "src": "49811:68:0",
                                      "statements": [
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 3000,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "id": 2998,
                                              "name": "amountOut",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2984,
                                              "src": "49833:9:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "id": 2999,
                                              "name": "maxChangeAmount",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2848,
                                              "src": "49845:15:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "49833:27:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 3001,
                                          "nodeType": "ExpressionStatement",
                                          "src": "49833:27:0"
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 3009,
                                              "name": "_strategy",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2858,
                                              "src": "49923:9:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IStrategy_$147",
                                                "typeString": "contract IStrategy"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_IStrategy_$147",
                                                "typeString": "contract IStrategy"
                                              }
                                            ],
                                            "id": 3008,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "49915:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 3007,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "49915:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 3010,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "49915:18:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 3011,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2984,
                                          "src": "49935:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3004,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2844,
                                          "src": "49896:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        "id": 3006,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "safeTransfer",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 209,
                                        "src": "49896:18:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$72_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$72_$",
                                          "typeString": "function (contract IERC20,address,uint256)"
                                        }
                                      },
                                      "id": 3012,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "49896:49:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3013,
                                    "nodeType": "ExpressionStatement",
                                    "src": "49896:49:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3024,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3014,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2852,
                                          "src": "49963:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 3016,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "memberName": "balance",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1677,
                                        "src": "49963:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "arguments": [],
                                            "expression": {
                                              "argumentTypes": [],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3020,
                                                "name": "amountOut",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2984,
                                                "src": "49995:9:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "id": 3021,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "to128",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 359,
                                              "src": "49995:15:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                                "typeString": "function (uint256) pure returns (uint128)"
                                              }
                                            },
                                            "id": 3022,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "49995:17:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3017,
                                              "name": "data",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2852,
                                              "src": "49978:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                                                "typeString": "struct BentoBoxV1.StrategyData memory"
                                              }
                                            },
                                            "id": 3018,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "balance",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 1677,
                                            "src": "49978:12:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          },
                                          "id": 3019,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 435,
                                          "src": "49978:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                            "typeString": "function (uint128,uint128) pure returns (uint128)"
                                          }
                                        },
                                        "id": 3023,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "49978:35:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "49963:50:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "id": 3025,
                                    "nodeType": "ExpressionStatement",
                                    "src": "49963:50:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3029,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2984,
                                          "src": "50046:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3026,
                                          "name": "_strategy",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2858,
                                          "src": "50031:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IStrategy_$147",
                                            "typeString": "contract IStrategy"
                                          }
                                        },
                                        "id": 3028,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "skim",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 120,
                                        "src": "50031:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$",
                                          "typeString": "function (uint256) external"
                                        }
                                      },
                                      "id": 3030,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "50031:25:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3031,
                                    "nodeType": "ExpressionStatement",
                                    "src": "50031:25:0"
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3033,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2844,
                                          "src": "50097:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 3034,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2984,
                                          "src": "50104:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$72",
                                            "typeString": "contract IERC20"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 3032,
                                        "name": "LogStrategyInvest",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1653,
                                        "src": "50079:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$72_$_t_uint256_$returns$__$",
                                          "typeString": "function (contract IERC20,uint256)"
                                        }
                                      },
                                      "id": 3035,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "50079:35:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3036,
                                    "nodeType": "EmitStatement",
                                    "src": "50074:40:0"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3098,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3094,
                              "name": "strategyData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1722,
                              "src": "50629:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$72_$_t_struct$_StrategyData_$1678_storage_$",
                                "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                              }
                            },
                            "id": 3096,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3095,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2844,
                              "src": "50642:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$72",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "50629:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                              "typeString": "struct BentoBoxV1.StrategyData storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 3097,
                            "name": "data",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2852,
                            "src": "50651:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1678_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData memory"
                            }
                          },
                          "src": "50629:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1678_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "id": 3099,
                        "nodeType": "ExpressionStatement",
                        "src": "50629:26:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2842,
                    "nodeType": "StructuredDocumentation",
                    "src": "47507:483:0",
                    "text": "@notice The actual process of yield farming. Executes the strategy of `token`.\n Optionally does housekeeping if `balance` is true.\n `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\n @param token The address of the token for which a strategy is deployed.\n @param balance True if housekeeping should be done.\n @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract."
                  },
                  "functionSelector": "66c6bb0b",
                  "id": 3101,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "harvest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2849,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2844,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3101,
                        "src": "48267:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$72",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2843,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 72,
                          "src": "48267:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$72",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2846,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3101,
                        "src": "48289:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2845,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48289:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2848,
                        "mutability": "mutable",
                        "name": "maxChangeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3101,
                        "src": "48311:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2847,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "48311:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48257:83:0"
                  },
                  "returnParameters": {
                    "id": 2850,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48348:0:0"
                  },
                  "scope": 3106,
                  "src": "48241:2421:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3104,
                    "nodeType": "Block",
                    "src": "50825:2:0",
                    "statements": []
                  },
                  "documentation": null,
                  "id": 3105,
                  "implemented": true,
                  "kind": "receive",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3102,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50805:2:0"
                  },
                  "returnParameters": {
                    "id": 3103,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50825:0:0"
                  },
                  "scope": 3106,
                  "src": "50798:29:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3107,
              "src": "27784:23045:0"
            }
          ],
          "src": "891:49939:0"
        },
        "id": 0
      }
    }
  }
}
